jQueryの非圧縮ソースコードを表示しているときに、よくわからないことがありました。匿名関数を作成するとき、2番目の引数としてundefinedを配置します。これは何をしているのですか、そしてなぜ彼らは未定義を使用しているのですか?匿名関数に引数としてundefinedを入れる必要がありますか?以下は私が話していることの例です。
(function( window, undefined) {
...code here
})( window );
jQueryの非圧縮ソースコードを表示しているときに、よくわからないことがありました。匿名関数を作成するとき、2番目の引数としてundefinedを配置します。これは何をしているのですか、そしてなぜ彼らは未定義を使用しているのですか?匿名関数に引数としてundefinedを入れる必要がありますか?以下は私が話していることの例です。
(function( window, undefined) {
...code here
})( window );
これが行っているのは、そのクロージャーの内側に再割り当てundefined
することです。undefined
それはフェイルセーフです。他のコードが誤って次のようなことをする可能性があるため
undefined = something;
console.log(undefined); // will output 'something'
そして、それはjavascriptで有効です(使用されているJSエンジンがECMAScript 5仕様を実装していない場合、ECMAScript 5仕様undefined
は非MDNDOCです)non-writable
、
MDN New_in_JavaScript 1.8.5(ECMA 5)ページからの引用
グローバルオブジェクトへの変更
グローバルオブジェクトを読み取り専用にしました
NaN、Infinity、および未定義のグローバルオブジェクトは、ECMAScript 5仕様に従って、読み取り専用になっています。
そしてES5 Annotated Spec
Guthubから
ES5 spec Section
x15.1.1.3
15.1.1.3未定義
undefinedの値はundefinedです(8.1を参照)。
このプロパティの属性は{ [[Writable]]:false、[[Enumerable]]:false、[[Configurable]]:false}です。
global undefined
書き込み可能でない場合でも、名前付きのローカル変数undefined
を使用して、コードを混乱させる可能性があります(主にとの比較undefined
)。しかし、それはあなたの責任です。あなたは次のようなコードを持つことができます
(function(){
console.log('Second Case: ');
var undefined = 'Something';
console.log(undefined); // Will log `something`
var a ; // a is undefined
console.log(a === undefined); // false, as undefined is changed
// you might expect a === undefined will return true, but as
// `undefined` is changed it will return false.
console.log(a); // undefined
})();
デモ: http: //jsfiddle.net/joycse06/V4DKN/
ただし、undefined
が書き込み可能である場合、上記の割り当ては、そのコード行の後にcomparison
作成された多くのコードを妨げる可能性があります。今ではある程度の価値があります。undefined
undefined
undefined
だから彼らはその匿名関数を次のように呼び出しているので
( window ) // one argument only
そして受け取る
( window, undefined) // only window is passed when calling the function
// Second argument is not passed means it's undefined
// so undefined is restored to undefined inside that function
// and no global accidental assignments can hamper jQuery's
// code using 'undefined' now
つまり、クロージャの内部では値が渡されていないため、クロージャundefined
がに復元され、匿名関数の内部での使用が保証されます。undefined
undefined
このhttp://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/に関する非常に優れた詳細な記事
私は物事を明確にするために上記の記事のリンクからいくつかの行を引用しています
未定義とは何ですか?
JavaScriptには、 Undefined(タイプ)、undefined(値)、およびundefined(変数)があります。
Undefined(type)は、組み込みのJavaScriptタイプです。
undefined(value)はプリミティブであり、Undefinedタイプの唯一の値です。
値が割り当てられていないプロパティは、未定義の値を想定しています。(ECMA 4.3.9および4.3.10)。
returnステートメントのない関数、または空のreturnステートメントのある関数は、未定義を返します。提供されていない関数の引数の値は未定義です。
var a;
typeof a; //"undefined"
window.b;
typeof window.b; //"undefined"
var c = (function() {})();
typeof c; //"undefined"
var d = (function(e) {return e})();
typeof d; //"undefined"
undefined(変数)は、初期値が未定義(value)であるグローバルプロパティです。グローバルプロパティであるため、変数としてアクセスすることもできます。一貫性を保つために、この記事では常にこれを変数と呼びます。
typeof undefined; //"undefined"
var f = 2;
f = undefined; //re-assigning to undefined (variable)
typeof f; //"undefined"
ECMA 3の時点で、その値を再割り当てできます。
undefined = "washing machine"; //assign a string to undefined (variable)
typeof undefined //"string"
f = undefined;
typeof f; //"string"
f; //"washing machine"
言うまでもなく、未定義の変数に値を再割り当てすることは非常に悪い習慣であり、実際にはECMA5では許可されていません。
Undefinedはタイプですが、グローバル変数でもあります。
を実行すると、undefinedの値を上書きするモジュールを作成できますundefined = whatever
。
undefined
は、実際には、コード全体をラップする関数の未定義のパラメーターです。
(function(window, undefined) {
// undefined is the undefined parameter
}(window));
undefined
パラメータはローカルスコープにあり、この関数のコード以外は誰もパラメータに割り当てることができないため、安全です。
undefined
匿名関数を定義するときにパラメーターとして使用する必要はありません。
上記の関数を見ると、2つのパラメーターが必要ですが、 1つが指定されていることがわかります。
なぜundefined
復元する必要があるのですか?
なぜなら、誰かがグローバルスコープのようなものを書いたとしても、それundefined
が実際undefined
に中括弧の間のスコープ内にあることを確認するためです。なぜなら、実際には再定義できるからです。undefined = "defined";
undefined
だからあなたが
var undefined = 1;
(function(window, undefined) {
console.log(undefined); // output will be undefined not 1
}(window));
jQueryは、undefined
そのパラメーターに引数を渡さないことにより、スコープ内で実際に未定義であることを確認しています。
undefined
が実際に未定義ではない場合を例にとると、次のコードがあります。
var undefined = 1;
alert(undefined); // 1