19

jQueryの非圧縮ソースコードを表示しているときに、よくわからないことがありました。匿名関数を作成するとき、2番目の引数としてundefinedを配置します。これは何をしているのですか、そしてなぜ彼らは未定義を使用しているのですか?匿名関数に引数としてundefinedを入れる必要がありますか?以下は私が話していることの例です。

(function( window, undefined)  {
  ...code here
})( window );
4

3 に答える 3

20

これが行っているのは、そのクロージャーの内側に再割り当て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)ページからの引用

グローバルオブジェクトへの変更

グローバルオブジェクトを読み取り専用にしました

NaNInfinity、および未定義のグローバルオブジェクトは、ECMAScript 5仕様に従って、読み取り専用になっています。

そしてES5 Annotated SpecGuthubから

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作成された多くのコードを妨げる可能性があります。今ではある程度の価値があります。undefinedundefinedundefined

だから彼らはその匿名関数を次のように呼び出しているので

( 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がに復元され、匿名関数の内部での使用が保証されます。undefinedundefined

この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では許可されていません。

于 2012-06-23T06:12:01.043 に答える
3

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));
于 2012-06-23T06:10:13.090 に答える
2

jQueryは、undefinedそのパラメーターに引数を渡さないことにより、スコープ内で実際に未定義であることを確認しています。

undefinedが実際に未定義ではない場合を例にとると、次のコードがあります。

var undefined = 1;
alert(undefined); // 1
于 2012-06-23T06:11:58.853 に答える