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