JavaScript中调用的这个练习是什么?

当你用这样的函数包装你的JavaScript代码:

(function(){ var field = ...; function doSomthing(){... ... })(); 

我注意到这在很多网页上为我解决了范围问题。 这种做法叫做什么?

该模式被称为自调用 ,一个自调函数 。 它可以创build一个闭包,但这是该模式的效果(可能是预期的效果),而不是模式本身。

为了澄清下面的评论, 大多数时候它创build一个闭包 ,它保持你的variables作用域到本地闭包,不创build全局variables,它既保持干净,避免任何潜在的不必要的变化这些variables。

这里有一些优秀的答案,解释了为什么多一点: 如何一个JavaScript封闭工作?

这只是一个创build闭包,当范围内的东西暴露在外部的范围,这是通常的情况下,但我不能确定你的例子没有看到更多的代码。 如果什么都没有暴露,那么没有封闭的创build…否则它只是一个匿名函数立即执行。

})(); 格式在最后,而不是}); 实际上是调用该闭包立即执行,没有参数。 如果你有东西,例如})(something); 那么something会作为第一个参数在这里传递: (function(somethingParam){

包装函数被称为匿名函数(它没有名字,也没有赋值给variables)是自动执行的(它自己立即执行)函数。

我不记得看到这个模式的确切名称,但它防止variables泄漏到全球范围。

本·阿尔曼针对这种“模式”的常用术语提出了一个有趣的论点。

他的博客文章在这里(http://benalman.com/news/2010/11/immediately-invoked-function-expression/); 。

如果他的post对于你来说太长了,这里是我的总结(我仍然build议阅读,因为这个摘要留下了很多):

如果你想要一个命名的函数来自动执行/调用它应该看起来像这样:

 // 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.../ }()); 

我对此事的看法:

其他答案是正确的。 你所问的通常被称为“自我调用匿名function”。
但是,这个术语并不能准确反映真正发生的事情, “即时调用函数expression式”(又名“iffy”,简称)似乎是一个更合适的术语。


有趣的事实来打动你的朋友:

你也可以这样创build一个Iffy:

 !function(){ alert("immediately invoked!"); }(); 

要么

 +function(){ alert("immediately invoked!"); }(); 

或者如果你确实是 cRaZy( 例子 ):

 !1%-+~function(){ alert("immediately invoked!"); }(); 

在大多数浏览器(如果不是全部,我不确定),效果将是相同的(Facebook使用!版本)。

Douglas Crockford和YUI团队称之为模块模式 。

这种做法叫做什么?

它被称为立即调用的函数expression式 ,简称:IIFE。 它在一个expression式中定义了一个函数,然后它自己执行(没有将函数分配给任何标识符)。 它有时也被称为立即执行函数expression式 (IEFE)。

在本·阿尔曼在他们写博客文章之前,他们也被称为自我调用(匿名)function ,这个术语从那时起就变得罕见了。 这在技术上是不准确的,暗示了一个实际上并没有发生的recursion调用。

有关语法的详细信息,请参阅说明 自动执行匿名JavaScript函数 的封装匿名函数语法和括号的位置? 。

我注意到这在很多网页上为我解决了范围问题。

是的, 这个模式的目的是通过执行一个函数来引入一个额外的范围。

该模式有时也被扩展为一个返回值,称为(显示)模块模式 ,或者用函数的名称来允许recursion调用。

它比“模式”更长。 这是scheme / lisp中常用的习惯用法,主要用于封装,特别是在进行元编程时。

版本1: –

 function mySpace() { var obj = {}; obj.name = "Deepak"; obj.whoami = function () { return obj.name; } window['myObject'] = obj; } mySpace(); myName = myObject.whoami(); console.log(myName); 

版本2: –

 (function(){ var obj = {}; obj.name = "Deepak"; obj.whoami = function () { return obj.name; } window['myObject'] = obj; })(); myName = myObject.whoami(); console.log(myName); 

我们没有调用Version 2中的任何命名函数来初始化myObject,但是它可用于全局范围。

您只能链接<script src="jquery.min.js"></script>$ object可供使用。 这种风格被称为自我调用function。