vea*_*top 7 javascript closures
这些结构之间有什么区别,优点/缺点(如果有的话)?
new function(obj) {
console.log(obj);
}(extObj);
Run Code Online (Sandbox Code Playgroud)
VS
(function(obj) {
console.log(obj);
})(extObj);
Run Code Online (Sandbox Code Playgroud)
第一个返回对新构造的匿名构造函数(= this
)实例的引用.
第二个返回匿名函数的返回值.由于您的函数没有return语句,因此它将隐式返回undefined.
请尝试以下方法:
var t1 = new function(obj) { console.log(obj); }(extObj);
var t2 = (function(obj) { console.log(obj); })(extObj);
typeof t1 => "object"
typeof t2 => "undefined"
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,t1.constructor
将返回您创建的原始函数t1
.)
如果添加return语句,差异会变得更加清晰:
var t1 = new function(obj){ return(obj); }("foo");
var t2 = (function(obj){ return(obj); })("bar");
console.log(t1) => "object"
console.log(t2) => "bar"
Run Code Online (Sandbox Code Playgroud)
IMO,这(function)()
对于日常用例更有用 - 您可以将此函数执行的返回值分配给变量,如果您正在使用立即调用的函数,该变量通常就是您想要的变量.特别是当有更复杂的东西,如(伪代码):
var myNameSpace = (function(){
/* do some private stuff here*/
...
/* expose parts of your anonymous function by returning them */
return{
functionX,
variable1,
variable2
}
}();
Run Code Online (Sandbox Code Playgroud)
基本上,您可以使用任意一元运算符将函数声明转换为表达式,该表达式立即被调用.所以你也可以写:
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
Run Code Online (Sandbox Code Playgroud)
根据函数的return语句,这些将给出不同的返回结果.!
- 否定returnvalue +|-
评估为Number(应用负号)~
适用bitwise not
于返回值.
如果您正在考虑明确处理立即调用的函数,那么两者之间没有任何真正的区别,除了第一个函数将this
自动返回到函数内部、外部世界(这就是所做new
的) ,并且默认情况下如果未指定不同的返回值(常规函数返回undefined
)。
其余的主要差异并不重要——访问原型链将毫无意义,将返回的this.constructor
点指向匿名函数将使您可以访问缓存匿名函数以供以后使用(例如从事件侦听器中删除它,如果您以某种方式设法将封闭的函数粘在... ...这本身就是一个技巧)。
允许人们将立即调用的函数缓存为返回this
对象的构造函数属性可能会存在安全风险......或者它可能非常有用......在非常特定的场景中。
内嵌代码的日常用途——没有真正的区别。
归档时间: |
|
查看次数: |
1417 次 |
最近记录: |