ste*_*bot 57 javascript design-patterns terminology
当您将JavaScript代码包装在这样的函数中时:
(function(){
var field = ...;
function doSomthing(){...
...
})();
Run Code Online (Sandbox Code Playgroud)
我注意到这在很多网页上为我修复了范围问题.这种做法叫做什么?
pal*_*wim 38
该模式称为自调用,是一种自调用函数.它可以创建一个闭包,但这是模式的效果(可能是预期的效果),而不是模式本身.
Nic*_*ver 20
为了澄清下面的注释,大部分时间它都在创建一个闭包,它将你的变量限定为该局部闭包,因为它不会创建全局变量,它既可以保持清洁,又可以避免对这些变量进行任何潜在的不必要的更改.
这里有一些很好的答案可以解释为什么更多:javascript闭包是如何工作的?
它只是一个创建闭包,当该范围内的某些东西暴露给外部作用域时(通常是这种情况),但是如果没有看到更多代码,我无法确定您的示例.如果什么都没有暴露,那么没有创建闭包......否则它只是一个匿名函数立即执行.
最后的})();
格式,而不是});
实际上调用该闭包立即执行,没有参数.如果你有一些东西,例如})(something);
那么something
它将作为第一个参数在这里传递:(function(somethingParam){
.
Jan*_*nen 15
包装函数被称为匿名(它没有名称,并且没有分配给变量)自动执行(它自己立即执行)函数.
我不记得看到这个模式的确切名称,但它阻止变量泄漏到全局范围.
Dav*_*och 12
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();
}
Run Code Online (Sandbox Code Playgroud)
如果你想让一个匿名函数自动执行/调用它应该如下所示:
// 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();
};
Run Code Online (Sandbox Code Playgroud)
如果您希望立即执行/调用匿名函数,它应如下所示:
// 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.../ }());
Run Code Online (Sandbox Code Playgroud)
我对此事的看法:
其他答案都是正确的; 你所问的通常被称为"自我调用匿名函数".
但是,该术语并不能准确反映真实情况; "立即调用函数表达式"(简称"iffy")似乎是一个更合适的术语.
有趣的事实来打动你的朋友:
您也可以像这样创建一个Iffy:
!function(){
alert("immediately invoked!");
}();
Run Code Online (Sandbox Code Playgroud)
要么
+function(){
alert("immediately invoked!");
}();
Run Code Online (Sandbox Code Playgroud)
或者如果你真的是 cRaZy(例子):
!1%-+~function(){
alert("immediately invoked!");
}();
Run Code Online (Sandbox Code Playgroud)
在大多数浏览器中(如果不是全部,我不确定)并且效果将是相同的(Facebook使用该!
版本).
归档时间: |
|
查看次数: |
4057 次 |
最近记录: |