元スレ+ JavaScript の質問用スレッド vol.120 +
JavaScript覧 / PC版 /みんなの評価 :
601 = :
>>600
奇遇だね。この間循環参照が発生しても
メモリリークになるから問題ないって結論が出たんだよ。
602 = :
間違えた。
奇遇だね。この間循環参照が発生しても
メモリリークになるないから問題ないって結論が出たんだよ。
603 = :
function foo(element, a, b) {
element.onclick = foo1(a,b);
}
function foo1(a,b){
return function() { /* 引数 a と b を使う */ };
}
これでよし
604 = :
>>598>>599
いやあそれも不十分でしょう
document.all = { __proto__: HTMLAllCollection.prototype };
"all" in document // true
document.all instanceof HTMLAllCollection // true
606 = :
>>604
そこまで気にしていたら、document.all に限らず、既存のチェックが全て不十分だと思うけどなあ
document.all ではないチェックの場合、typeof演算子以外にも何か対策してる?
XMLHttpRequest とか querySelectorAll とか getComputedStyle とか
607 = :
そもそもそんなチェックすんの?しねーだろ
lodashで何の問題もない
609 = :
>>603
それやっても、aとbを参照することになるよね?
循環参照解決してないじゃんw
610 = :
>>608
> Object (non-standard exotic and does not implement [[Call]]) の判定を
それに当てはまるものって何?
document.allしかないとかじゃないの?
611 = :
>>609
>603ではないが、a, b がDOMでなければ循環参照しない
612 = :
element,a,b
なんだからa,bはdomじゃないだろJK
613 = :
> function foo(element, a, b) {
> element.onclick = foo1(a,b);
> }
>
> function foo1(a,b){
> return function() { /* 引数 a と b を使う */ };
> }
これよりもこっちのほうがよくない?
汎用的だし。
function foo(element, a, b) {
setEvent(element, 'onclick', function() { /* 引数 a と b を使う */ });
}
614 = :
>>612
え? domかもしれないじゃんか。
616 = :
>>613
それだとクロージャにelementが巻き込まれてる
617 = :
>>616
巻き込まれないよ。
element.onclickに代入するのは、別のコールバックだから。
618 = :
>>617
616じゃないが、普通に巻き込まれてるぞ
function foo(element, a, b) {
setEvent(element, 'onclick', function() { /* element参照可能 */ });
}
あと、コールバックの意味を誤解していると思われる
619 = :
>>618
え? DOMと循環参照しないようするに話でしょう?
そりゃelementは参照可能だけど、
DOMと循環参照しなければ何の問題もなくね?
620 = :
>>597
ゲームで使われてる
621 = :
あ
622 = :
>>619
elementを参照可能な事で循環参照が形成される
循環参照のロジックを勘違いしていると思われる
623 = :
>>615
そういえば実際にあったねw
var hoge = new ActiveXObject("Excel.Sheet");
typeof hoge // "unknown"
lodash の isObject だと当然 false になっちゃうけど、>>538 なら期待通り true になった
やはり >>538 が現時点で一番いい方法のように感じる
あと、document.all は Object (non-standard exotic and does not implement [[Call]]) ではないよ
オブジェクトであれば ToBoolean(hoge) は絶対 true だし、typeof hoge は "undefined" であってはいけない
http://html.spec.whatwg.org/multipage/obsolete.html#dom-document-all
"willful violation"(故意的な違反) とはっきり書いてある
624 = :
ActiveXObject("Excel.Sheet"); はJavaScriptの
正しいObjectではないんだけど、
これをObjectと判断するのは正しいの?
627 = :
non-standardっていうのは非標準って意味だよ。
628 = :
まあ日本語訳する意味はあまりないと思うけど、ActiveXObject は >>627 の考える非標準のオブジェクトではないの?
630 = :
>>628
非標準の"オブジェクト" って書いてはいるけどさ、
isObjectというのは、JavaScript標準のObjectであることを
調べるために使うはずで、ObjectなのにObjectの条件を満たしていないっていうのは
メソッドとしてはあってはならないことだと思うよ。
まあ自分で作ったものなんだからisObjectはObjectではないものも
Objectとして判定しますっていう仕様にしてもいいけどさ。
632 = :
ここにObjectが持っているメソッド一覧があるけどさ、
Objectであるならば、Objectを継承していないとダメだと思う。
当然toString()もここにある。
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object
635 :
>>623
補足ありがとうございます。
いわれてみれば、"unknown" には見覚えがある気がします。
document.all に関しては見かけ上、undefined なだけなので実体は何になるのかな、というのが少し気になったのです。
最も、故意に違反している以上、深く考えても仕方ないかもしれませんね…。
636 = :
実際には使いもしない機能に異常に拘る感じがundefined問題とかぶるな
現実的にはlodashで何の問題もない
637 = :
firebugとかから直接関数を呼ばれたり変数に値を入れられたりするのを阻止する方法ありませんか?
ソースコードを書き換えられるのは諦めますよ
638 = :
>>637
無名関数の中にでも入れてしまうわけにはいかんの?
639 = :
>>629
> window.alert.toString();ってIE8だとエラーになるんだよね。
> Objectであるならば、toString()を持っているはずなんだけど
少なくとも、ECMAScript 5 までは Object 型が Object のインスタンスを持つことを保証していません。
同じく、関数が Function のインスタンスであることも保証していません。
そもそも、仮に Object や Function のインスタンスであったとしても所属オブジェクトが toString を持っていたらそちらを参照するので、まずは該当仕様を確認すべきでしょう。
window.alert は HTML 5 規定ですが、toString は未定義です。
http://html.spec.whatwg.org/multipage/browsers.html#the-window-object
従って、window.alert.toString がどういう挙動を示すかは実装依存となります。
(IE8 リリース当時は window.alert は標準化されていなかったので、どちらにしろ IE8 の window.alert は実装依存ですが)
prototypeに存在するメソッドを該当オブジェクトに適用させたい場合は Function#call を使用するのが一般的です。
Function.prototype.toString.call(window.alert);
Object.prototype.toString.call(window.alert);
>>630
> ObjectなのにObjectの条件を満たしていないっていうのはメソッドとしてはあってはならないことだと思うよ。
なにやら誤解があるようですが、window.alert が Object 型であることは確かです。
>>623で紹介されている new ActiveXObject("Excel.Sheet") も Object 型です。
ECMAScript 6 では非標準(non-standard)の Object 型も規定しているので、これらは仕様の規定内です。
641 = :
IE8 の alert は、関数として実行できるのに、typeof alert == "object" ですよね。
ES3 11.4.3 によると、
「実装依存の オブジェクト/関数 は何を返してもいい」って書いてあります。
ES5 11.4.3 と ES6 12.5.6.1 によると、
「[[Call]] を持つオブジェクトは、"function" を返さないといけない」って書いてあります。
IE8 の alert は、ES3 には準じているけど、ES5,6 には準じていないって認識であってますか?
英語に自信がなくて、正しい理解なのか分かりません。
教えてください偉いひと(*´ω`*)
642 = :
var hash = {};
hashに入っているのは、Object?
{} と new Objectは同じ?
643 = :
>>642
同じです
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
> The production ObjectLiteral : { } is evaluated as follows:
> 1. Return a new object created as if by the expression new Object() where Object is the standard built-in constructor with that name.
645 = :
■主要FAQ (全部はhttp://fiddle.jshell.net/vSqKr/33/show/ )
Q1. 別窓・フレーム内容やローカルファイルを読み書きしたいのですが…
A1. 別サーバのページやファイルの内容はセキュリティ制約でアクセス不可です。
Q2. document.write()でページ内容を追加したいのですが…
A2. 一度表示完了後にwriteするとページ内容が消去されます。DOM等別手段を。
Q3. table内容のinnerHTMLやDOMでの変更がうまく行かないのですが…
A3. IEではtable/tbody/trのinnerHTML書き換え不可です。DOMを使いますが、
DOMの場合tableの直下にはtbody要素が(作らなくても)あることに注意。
Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
A4. 「document.forms.myform.elements[変数名].value」でどぞ。
JavaScriptでは一般に「obj.x」と「obj['x']」は同じ意味です。
グローバル変数はwindowのプロパティなので「x」と「window['x']」も。
Q5. CSSで設定した背景色がe.style.backgroundColorで取得できないのですが…
A5. 取得には document.defaultView.getComputedStyle() を使う必要あり。
IEでは要素オブジェクトのプロパティcurrentStyleを使う。
Q6. setAttribute("class","foo")、setAttribute("onclick","bar()")が動きません…
A6. IEではそれは不可。「obj.className="foo"」「obj.onclick=bar」でどぞ。
Q7. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A7. 実行時にthisが別のものを指してしまってる。以下のようにthisを束縛保存。
「function(x){return function(){...x...};}(this)」
Q8. input type="file"の値を設定(参照)できないのですが…
A8. セキュリティ制約のため設定は絶対に不可。参照はブラウザにより不可。
Q9. getElementById('ID名')や$('ID名')で要素が取れないのですが…
A9. コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか。
Q10. (function(global){~})(window)無名関数の中で循環参照を切る方法をおしえてください
A10. 無名関数の最後にglobal = nullをして参照を切る
646 = :
ユニットテストってしてる人いますか?
647 = :
そもそもテストをしなくてもいいと思ったからそういう質問したんだよね
何故テストをしなくてもいいと思ったのか説明しないと
648 = :
何故そう思ったんです?
しなくていいと思ってたら質問すらしないと思いますが?
649 = :
ではしたらいいんじゃいでしょうか
質問しなくてもわかってるんでしょ
650 = :
質問に対する回答以外の意見を書く人なんなんです?
アホなんですか?
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.124 + (1001) - [97%] - 2015/7/16 1:30
- + JavaScript の質問用スレッド vol.123 + (1002) - [97%] - 2015/4/27 23:30
- + JavaScript の質問用スレッド vol.125 + (1001) - [97%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.126 + (348) - [97%] - 2023/1/12 17:00
- + JavaScript の質問用スレッド vol.126 + (952) - [97%] - 2015/11/18 13:15
- + JavaScript の質問用スレッド vol.127 + (160) - [97%] - 2021/7/16 9:30
- + JavaScript の質問用スレッド vol.127 + (1001) - [97%] - 2016/2/4 0:15
- + JavaScript の質問用スレッド vol.123 + (966) - [97%] - 2020/10/20 2:30
- + JavaScript の質問用スレッド vol.128 + (1001) - [97%] - 2016/2/26 6:45
- + JavaScript の質問用スレッド vol.129 + (926) - [97%] - 2017/7/27 13:45
- + JavaScript の質問用スレッド vol.129 + (981) - [97%] - 2016/5/5 8:16
- + JavaScript の質問用スレッド vol.130 + (974) - [97%] - 2016/10/26 14:18
- + JavaScript の質問用スレッド vol.122 + (116) - [97%] - 2018/5/2 18:30
- + JavaScript の質問用スレッド vol.122 + (1004) - [97%] - 2015/2/14 4:45
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.130 + (1001) - [97%] - 2017/11/25 20:45
トップメニューへ / →のくす牧場書庫について