了解javascript函数、作用域和闭包

了解javascript函数、作用域和闭包,javascript,scope,closures,Javascript,Scope,Closures,有人能详细解释一下这个js片段是做什么的吗 (function (window) { var test = window['test'] = {}; test.utils = new(function(){ ... })(); })(window); 我知道函数的作用域不是全局的。我知道它正在创建一个名为test的变量,该变量指向窗口中的一个空对象属性。我也理解utils是test的一个属性 我不明白最后一部分的目的是什么(窗口)或为什么将utils功能指定为new 请解释。它

有人能详细解释一下这个js片段是做什么的吗

(function (window) {
    var test = window['test'] = {};
    test.utils = new(function(){ ... })();
})(window);
我知道函数的作用域不是全局的。我知道它正在创建一个名为test的变量,该变量指向
窗口中的一个空对象属性。我也理解
utils
是test的一个属性

我不明白最后一部分的目的是什么
(窗口)
或为什么将
utils
功能指定为
new


请解释。

它创建一个函数并立即调用它,传入
窗口。该函数接收一个名为
window
的参数,然后在其上创建一个空对象,该对象既可以作为名为
test
window
的属性,也可以作为名为
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);

这仍然会无缘无故地执行
窗口
的操作,但希望它能清楚地说明
的新功能(function(){…})()位正在执行。

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


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

当您使用最后一个父项定义函数时,在您的情况下
window

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

首先,这是一个自调用函数

它调用自身,将
窗口
对象作为函数输入参数,以确保在整个函数中,
窗口
具有预期的含义

test.utils = new(function(){ ... })(); <--- This is an object constructor. 
(窗口)的用途
正在创建一个新变量和引用来保存JavaScript
窗口
对象实例,避免其他库可能重用
窗口
(或任何其他)标识符,并且您自己的库可能会因为这种情况而中断

为了避免更改其他库可能使用的全局作用域标识符,这样做很好

更新 为了响应某些注释,请运行以下代码:


试图使匿名(外部)函数中的代码“安全”以防篡改
窗口
,这有点误导。它被误导了,因为它没有做到这一点:-)代码不应该通过
窗口
,而应该通过
。我也不明白。您从何处获得代码,构造函数调用的函数表达式包含什么?可能重复
new(function(){…})()
只是定义构造函数并一次性创建实例。它与
函数Foo(){…}
新Foo()相同。在这里使用对象文字可能更容易,但我不能说,因为我不知道函数的内容是什么。可能重复为什么您认为
窗口
变量可以避免修改全局对象?^^^^---它作为引用传递,修改也将应用于全局对象,这就是为什么我不明白这个@Bergi背后的目的好吧,也许我解释错了。我的意思是,您可以避免覆盖标识符并更改窗口或任何对象的设计用途。@在检查我的更新时,现在我的解释比以前更好了:)->这不会更改任何内容,您不能将
window
设置为
null
。我真的看不出有什么用,将
窗口
对象的复制引用设置为null,如果使用
窗口
变量,可能会有助于缩小。这是我听说的唯一原因,但我认为这样的事情应该由minifier来做:-)那么
test.utils=new(function(){…})()之间的区别是什么
test.utils=function(){…}
?@bflemi3:在第一种情况下,
test.utils
将引用几乎肯定不是函数的对象。在第二种情况下,
test.utils
将引用函数。
var conztructor = function() {
   this.name = "Matias";
};

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