3

Can someone explain in detail what this snippet of js does?

(function (window) {
    var test = window['test'] = {};
    test.utils = new(function(){ ... })();
})(window);

I understand that the function is not globally scoped. I understand that it is creating a variable called test that points to a property in the window object that is an empty object. I also understand that utils is a property of test.

I don't understand what the purpose of the last part is (window); or why the utils function is being designated as new.

Please explain.

4

4 に答える 4

2

関数を作成し、すぐに呼び出して、を渡しwindowます。この関数は、呼び出された引数を受け取り、そのwindow上に空のオブジェクトを作成します。このオブジェクトは、呼び出されたときのプロパティとしても、windowと呼ばtestれるローカル変数としても使用できますtest。次に、を介して関数を呼び出してオブジェクトを作成し、newそのオブジェクトをに割り当てますtest.utils

最後の部分の目的が何であるかわかりません(ウィンドウ);..。

windowmain(外部)関数に渡されるシンボルは、それを受け取る引数の名前と同じであるため、引用したコードでは実際には何の目的も果たしません。それらの名前が異なる場合、それは目的を果たします、例えば:

(function(wnd) {
})(window);

これによりwindow、関数内でとして使用できるようになりますwnd

または、utils関数が新規として指定されている理由。

utils関数ではありません(少なくとも、置き換えたコードが本当に...奇妙なことをしている場合を除いて)、その関数を呼び出すことによって作成されたオブジェクトになります。

全体をより明確に書き直すことができます。

(function(window) {

    var test;

    test = {};
    window['test'] = test;

    test.utils = new NiftyThing();

    function NiftyThing() {
    }

})(window);

それでもwindow理由はありませんが、new(function() { ... })();ビットが何をしていたかが明確になることを願っています。

于 2013-02-07T14:57:29.920 に答える
1

まず、これは自己呼び出し関数です。

関数全体の内部で期待される意味を持つことwindowを保証するために、関数入力引数としてオブジェクトを指定してそれ自体が呼び出されます。window

test.utils = new(function(){ ... })(); <--- This is an object constructor. 

関数が演算子を使用して呼び出されるとnew、オブジェクト コンストラクターに変わります。

例えば:

var conztructor = function() {
   this.name = "Matias";
};

var obj = new conztructor();
alert(obj.name); // <--- This will alert "Matias"!

の目的は(window);、JavaScript オブジェクト インスタンスを保持する新しい変数と参照を作成し、他のライブラリが(または他の) 識別子をWindow再利用して、この状況が原因で独自のライブラリが壊れるのを回避することです。window

これは、他のライブラリで使用される可能性のあるグローバル スコープ識別子の変更を避けるために便利です。

アップデート

いくつかのコメントに応答して、次のコードを実行します。

http://jsfiddle.net/wChh6/5/

于 2013-02-07T15:08:34.467 に答える
0

ここで起こっているのは、新しい匿名関数が宣言されているということです。の最後の部分は、パラメータとして(window)渡して、その関数を呼び出しwindowます。

内部で、を呼び出すと、test.utils = new(function(){ ... })();(に渡される関数によって定義されたコンテンツを含むnew)新しいオブジェクトが作成され、に割り当てられtest.utilsます。

于 2013-02-07T14:57:32.883 に答える
0

最後の括弧を使用して関数を定義すると、指定されたパラメーターを使用してロードした後、関数自体が実行されます。window

(function (window) {
    var test = window['test'] = {};
    test.utils = new(function(){ ... })();
})(window);

JS関数の定義:最後の括弧の意味

于 2013-02-07T14:57:59.723 に答える