了解javascript函数,范围和闭包

时间:2013-02-07 14:55:01

标签: javascript scope closures

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

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

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

我不明白最后一部分的目的是(window);utils函数被指定为new的原因。

请解释。

4 个答案:

答案 0 :(得分:2)

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

  

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

它在您引用的代码中并没有真正起任何作用,因为传递给main(外部)函数test.utils的符号与接收它的参数的名称相同。如果他们的名字不同,那么它就有用了,例如:

window

这会使(function(wnd) { })(window); 在函数中可用window

  

或为什么将utils函数指定为新函数。

wnd不会是一个函数(至少,除非您用utils替换的代码正在做真的奇怪的事情),它将是一个函数调用该函数创建的对象。

整个事情可以更清楚地重写:

...

仍然无缘无故地执行(function(window) { var test; test = {}; window['test'] = test; test.utils = new NiftyThing(); function NiftyThing() { } })(window); 事情,但希望它能清楚地表明window位正在做什么。

答案 1 :(得分: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/

答案 2 :(得分:0)

这里发生的事情是声明了一个新的匿名函数。 (window)的最后一部分调用该函数,将window作为参数传递。

在内部,对test.utils = new(function(){ ... })();的调用会创建一个新对象(内容由传递给new的函数定义)并将其分配给test.utils

答案 3 :(得分:0)

当您使用最后一个parentetheses定义一个函数时,在加载给定参数后,函数自行执行,在您的情况下window

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

JS function definition : meaning of the last parentheses

相关问题