当您将 JavaScript 代码包装在这样的函数中时:
(function(){
var field = ...;
function doSomthing(){...
...
})();
我注意到这在很多网页上为我解决了范围界定问题。这种做法叫什么?
当您将 JavaScript 代码包装在这样的函数中时:
(function(){
var field = ...;
function doSomthing(){...
...
})();
我注意到这在很多网页上为我解决了范围界定问题。这种做法叫什么?
该模式称为self-invocation,一种自调用函数。它可以创建一个闭包,但这是模式的效果(也许是预期的效果),而不是模式本身。
为了澄清下面的评论,大多数情况下它是创建一个闭包,它使您的变量作用域限于该局部闭包,因为不创建全局变量,它既保持事物干净,又避免对这些变量进行任何潜在的不需要的更改。
这里有一些很好的答案可以解释为什么多一点:javascript 闭包如何工作?
当该范围内的某些内容暴露给外部范围时,这只是一个创建闭包,通常是这种情况,但是如果没有看到更多代码,我无法确定您的示例。如果什么都没有暴露,那么就不会创建闭包……否则它只是一个立即执行的匿名函数。
最后的})();
格式,而不是});
实际上调用该闭包立即执行,没有参数。例如,如果你有一些东西,})(something);
那么something
它将作为第一个参数传递在这里:(function(somethingParam){
。
包装函数被称为匿名(它没有名称,也没有分配给变量)自执行(它自己立即执行)函数。
我不记得看到这种模式的确切名称,但它可以防止变量泄漏到全局范围内。
Ben Alman 就这种“模式”的常用术语提出了一个有趣的论点。
他的博客文章在这里 (http://benalman.com/news/2010/11/immediately-invoked-function-expression/)。
如果他的帖子对你来说太长,这里是我的总结(我仍然建议阅读它,因为这个总结遗漏了很多):
如果您希望命名函数自执行/调用,它应该如下所示:
// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
foo();
}
如果您希望匿名函数自执行/调用,它应该如下所示:
// Hello, I have no name...
// (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
arguments.callee();
};
如果您希望立即执行/调用匿名函数,它应该如下所示:
// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
// even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
// or "iffy" for short.
(function(){ /...code.../ }());
我个人对这个问题的看法:
其他答案是正确的;您所问的通常称为“自调用匿名函数”。
但是,该术语并不能准确反映实际发生的情况。“立即调用的函数表达式”(简称“iffy”)似乎是一个更合适的术语。
有趣的事实给你的朋友留下深刻印象:
你也可以像这样创建一个 iffy:
!function(){
alert("immediately invoked!");
}();
或者
+function(){
alert("immediately invoked!");
}();
或者如果你真的很疯狂(例子):
!1%-+~function(){
alert("immediately invoked!");
}();
在大多数浏览器中(如果不是全部,我不确定)并且效果将相同(facebook 使用该!
版本)。
Douglas Crockford 和 YUI 团队将其称为module模式。