の次のコードでjQuery
、なぜ次のパラメータがundefined
JavaScript:
(function(a,b){
....
})(window)
ここa=window
ですがb=undefined
、なぜそうなのですか?
の次のコードでjQuery
、なぜ次のパラメータがundefined
JavaScript:
(function(a,b){
....
})(window)
ここa=window
ですがb=undefined
、なぜそうなのですか?
これは、ウィンドウ オブジェクトのプロパティが以前は書き込み可能であり、チェックで確実に使用できなかったため、チェックする真のundefined
値があることを確認するための一般的な手法です。undefined
関数に渡されるパラメーターは 1 つだけなので、2 番目のパラメーターは確実に になりますundefined
。その変数の名前は重要ではありません。この場合のように、またはそうである可能性がありますundefined
(foobar
これが貴重なバイトを節約するための最短の方法であるため) b
。
b の値について確信があるので、変数の未定義を安全にチェックできるようになりました。
// overwriting the global undefined property works in old browsers
undefined = 3;
(function(a,b){
var asd; // not initialised, thus undefined
if (asd === undefined){
// should trigger, but won't because undefined has been overwritten to 3
}
if (asd === b){
// is safe, bcause you know that b is undefined
}
})(window)
新しいブラウザ (IE9、FF4+、Chrome) は EcmaScript5 仕様に準拠しておりundefined
、書き込みができなくなりました。
2 番目のパラメーターには何も渡していないためです。つまり、1つだけを渡していますwindow
。
あなたのコード
(function(a,b){
....
})(window)
関数を定義し、すぐに呼び出します。上記の最後の行は、window
パラメーターを使用して実際に関数を呼び出します。そこに 2 つのパラメーターを渡すと、b
未定義にはなりません。
これは、使用しようとしている即時の JavaScript 関数構文です。
(/* function body */)(/* params */)
次のように定義された名前付き関数:
function addNumbers(a, b){
alert(a + b);
}
あなたはそれを呼びます:
addNumbers(1, 2)
または同様の即時関数 (同時に定義および実行):
(function(a, b){
alert(a + b);
})(1, 2)