了解javascript函数、作用域和闭包
Understanding javascript functions, scope and closures
有人能详细解释一下这个js片段的作用吗?
(function (window) {
var test = window['test'] = {};
test.utils = new(function(){ ... })();
})(window);
我知道该函数不是全局范围的。我知道它正在创建一个名为test的变量,该变量指向window
对象中的一个空对象属性。我也理解utils
是测试的一个性质。
我不明白最后一部分的目的是(window);
,也不明白为什么utils
函数被指定为new
。
请解释。
它创建一个函数并立即调用它,传入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() { ... })();
比特在做什么。
首先,这是一个自调用函数。
它调用自己,将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/
这里发生的事情是正在声明一个新的匿名函数。(window)
的最后一部分调用该函数,将window
作为参数传递。
在内部,对test.utils = new(function(){ ... })();
的调用创建一个新对象(其内容由传递给new
的函数定义),并将其分配给test.utils
。
当您定义一个具有最后一个父级的函数时,该函数在加载给定参数后自动执行,在您的情况下为window
(function (window) {
var test = window['test'] = {};
test.utils = new(function(){ ... })();
})(window);
JS函数定义:最后括号的含义
- 作用域问题-此函数是否形成闭包-JavaScript
- 使用JavaScript回调函数了解变量作用域和闭包
- 具有闭包函数作用域的意外行为
- 作为闭包的回调中的Javascript变量作用域
- javascript中的返回函数,理解作用域&闭包
- JavaScript闭包和作用域问题
- 为什么我的内部内部函数可以访问外部全局作用域变量?这是不是违反了作用域/闭包
- 闭包回调中参数的作用域
- javascript中的闭包只限制变量的作用域吗?
- 将作用域变量传递给在该作用域之外声明的闭包
- 闭包在函数作用域之外不起作用
- 将变量添加到函数作用域/闭包中.函数相当于窗口对象
- 如何程序设置Javascript getter/setter ?(或者实际上是闭包作用域)
- 当使用块作用域变量创建JS闭包时会发生什么?
- 如何在ES2015中解构所有属性到当前作用域/闭包
- 在闭包作用域中设置变量
- 从外部(即定义闭包的作用域)访问闭包内部定义的var
- 显式地将变量作用域设置在函数内而不是闭包内
- 为什么这个闭包作用域的变量失去了它的值
- 如何在JavaScript中访问闭包作用域中的变量