一、JS立即执行函数的写法
方式1、最前最后加括号
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
(function(){alert(1);}());
方式2、function外面加括号
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
(function(){alert(1);})();
方式3、function前面加运算符,常见的是!与void
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
!function(){alert(1);}(); void function(){alert(2);}();
二、立即执行函数的参数
可以给立即执行函数传递参数,例如
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
(function(who, when) { console.log("I met " + who + " on " + when); } ("Joe Black", new Date()));
记住:
1、立即函数内部是可以访问外部变量的,所以很多情况下,我们并不需要传参数。如:jQuery的window实参,如果不传入。内部也是可以直接使用的。
2、通常你不应该给立即执行函数传递太多的函数,因为它很快会成为一个负担——为了理解代码是如何工作的,你不得不经常上下滚动源代码。
三、立即执行函数的返回值
像其它任何函数一样,一个立即执行函数也能返回值并且可以复制给其它变量,例如
var result = (function () {
return 2 + 2;
}());
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
var result = (function () { return 2 + 2; })();
四、立即执行函数的好处
1、立即执行函数模式被广泛使用,它可以帮你封装大量的工作而不会在背后遗留任何全局变量。
2、定义的所有变量都会成员立即执行函数的局部变量,所以你不用担心这些临时变量会污染全局空间。
3、这种模式经常被使用在书签工具(bookmarklets)中,因为书签工具在任何页面上运行并且保持全局命名空间干净是非常必要的;
4、这种模式也可以让你将独立的功能封装在自包含模块中。
5、可以将这些代码封装进一个立即执行函数中,并且确保页面没有它的情况下也能正常工作。
6、可以添加更多的加强模块,移除它们,单独测试它们,允许用户去禁用它们等等。
五、注意点
立即执行函数通常作为一个单独模块使用。一般没有问题,但是,建议在自己写的立即执行函数前加分号,这样可以有效地与前面代码进行隔离。否则,可能出现意想不到的错误。
例如
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
var c = 12
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/None.gif)
var d = c
![](http://m.studyofnet.com/Codefan-Controls/OutliningIndicators/ExpandedBlockStart.gif)
(function () { var e = 14; }())
会报这样一个错误: