有人可以详细解释这段js的作用吗?
(function (window) {
var test = window['test'] = {};
test.utils = new(function(){ ... })();
})(window);
我知道该函数不是全局范围的。我知道它正在创建一个名为test的变量,该变量指向window
对象中属于空对象的属性。我也明白utils
是测试的属性。
我不明白最后一部分的目的是(window);
或utils
函数被指定为new
的原因。
请解释。
答案 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
(或任何其他)标识符和您自己的因为这种情况,图书馆可能会破裂。
这很好,以避免更改其他库可能使用的全局范围标识符。
在回复一些评论时,请运行以下代码:
答案 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);