web-dev-qa-db-ja.com

未定義を渡す目的は何ですか?

jQueryおよびjQuery.UIのような関連する基調講演プラグインがundefinedをパラメーターとしてモジュール定義で使用される無名関数に渡すことに気づきました。

(function($, undefined) { ... })(jQuery);

あるいは、jQueryが推奨する他のプラグインや他のプラグインが未定義をパラメーターとして渡さないことに気づきました。

これはおそらくばかげた質問ですが...

とにかく常に利用できるべきではありませんか?なぜそれを渡すのですか?ここで何か他の目的やトリックが起こっていますか?

58
Prisoner ZERO

それには2つの理由があります。

1)undefinedがグローバルオブジェクトプロパティではなく関数スコープ内の変数である場合、ミニファイアはそれを1文字に縮小して、より良い圧縮率を実現できます。

2)ES5 *以前は、undefinedは書き込み保護のないグローバルオブジェクトのプロパティでした。そのため、上書きされて、奇妙で予期しない動作が発生する可能性があります。あなたはこのようなことをすることができます:

_var test = 123;
undefined = 123;
if (test === undefined){
   // this will actually be true, since undefined now equals 123
}
_

パラメータを渡さない関数の引数undefined(名前は実際には関係ありません)を持つことで、実際にundefinedである変数があることを確認して、テストすることができます。この変数に対する「未定義」。

ところで。未定義をテストする最も安全な方法は次のとおりです。typeof ( var ) === 'undefined'

(*)EcmaScript 5では、グローバルプロパティundefinedNaN、およびInfinityが読み取り専用になりました。そのため、最近のすべてのブラウザで一般的に採用されているため、もちろんIE 9を除いて)、これらの値を上書きすることはできなくなりました。

71
Christoph

これは、undefinedが常にundefinedであることを確認するために行われます。 ECMAScript仕様の古いバージョン(ECMAScript 5より前)では、undefinedは予約語ではなく通常の変数でした。古いブラウザでは、これはたとえば次のように許可されます。

undefined = 2; // Assign a different value to undefined

// Now this statement would be true
if (undefined == 2)

したがって、undefinedが実際にundefinedであることを確認するために、他の「邪悪な」スクリプトがundefinedを別の値で再割り当てした場合でも、undefinedを呼び出すパラメーターを作成し、関数を呼び出すときに、渡さないようにします。そのパラメーターの値-したがって、未定義の変数が関数内で常に未定義になることを確認できます。

したがって、jQueryの場合:

(function($, undefined) { ... })(jQuery);

便宜上、jQueryを渡して$変数に割り当てますが、undefinedパラメーターに2番目の値を渡さないため、undefinedは未定義になります。

最新のブラウザ

最近のブラウザでは、undefinedは、 ECMAScript 5仕様 に従って、構成および書き込み不可能なプロパティです。

17

undefinedはjavascriptで予約語ではなく、単なる変数です。 jQueryは、悪い開発者がjavascriptのundefinedの値を上書きした場合、jQueryがそれを無視し、値が渡されない独自の変数undefinedを確立することを保証しています(最後の自己実行(jQuery)を参照)。したがって、実際には未定義です。

10
jbabey