0

の次のコードでjQuery、なぜ次のパラメータがundefined

JavaScript:

(function(a,b){
    ....
})(window)

ここa=windowですがb=undefined、なぜそうなのですか?

4

3 に答える 3

7

これは、ウィンドウ オブジェクトのプロパティが以前は書き込み可能であり、チェックで確実に使用できなかったため、チェックする真の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、書き込みができなくなりました。

于 2013-03-01T08:12:42.500 に答える
6

2 番目のパラメーターには何も渡していないためです。つまり、1つだけを渡していますwindow

あなたのコード

(function(a,b){
    ....
})(window)

関数を定義し、すぐに呼び出します。上記の最後の行は、windowパラメーターを使用して実際に関数を呼び出します。そこに 2 つのパラメーターを渡すと、b未定義にはなりません。

于 2013-03-01T08:10:46.277 に答える
1

これは、使用しようとしている即時の JavaScript 関数構文です。

(/* function body */)(/* params */)

次のように定義された名前付き関数:

function addNumbers(a, b){
    alert(a + b);
}

あなたはそれを呼びます:

addNumbers(1, 2)

または同様の即時関数 (同時に定義および実行):

(function(a, b){
    alert(a + b);
})(1, 2)
于 2013-03-01T08:24:02.820 に答える