3

有人可以详细解释这段 js 的作用吗?

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

我了解该功能不是全局范围的。我知道它正在创建一个名为 test 的变量,该变量指向window对象中的一个属性,该属性是一个空对象。我也明白这utils是测试的一个属性。

我不明白最后一部分的目的是什么,(window);或者为什么将utils函数指定为new.

请解释。

4

4 回答 4

2

它创建一个函数并立即调用它,传入window. 该函数接收一个名为的参数window,然后在其上创建一个空对象,该对象既可以作为window调用的属性,也可以test作为局部变量调用test。然后它通过调用一个函数来创建一个对象new,并将该对象分配给test.utils.

我不明白最后一部分的目的是什么(窗口);...

它在您引用的代码中实际上没有任何用途,因为传递给主(外部)函数的符号window与接收它的参数的名称相同。如果他们的名字不同,那么它会有一个目的,例如:

(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);是创建一个新的变量和引用来保存 JavaScriptWindow对象实例,避免其他库可能重用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 回答