意译:自调用函数表达式
原文地址:https://github.com/airbnb/javascript/issues/21#issuecomment-10203921
一、写在前面
本文将一如既往地遵循从自身理解出发,而非100%按原文逐句翻译的方式进行“伪翻译”,若有谬误请各位指正,谢谢!!
二、介绍
IIFE(the Immediately Invoked Function Expression):定义函数的同时并执行该函数。
三、常见的使用方式
!function(){}(); // 返回 true ~function(){}(); // 返回 -1 +function(){}(); // 返回NaN -function(){}(); // 返回NaN void function(){}(); // 返回undefined
四、本文要讨论的使用方式
1. 方式一
(function(){
})();
2. 方式二(大神crockford推荐的方式):
(function(){
}());
五、两种使用方式的区别
让我们通过下面这个缺少分号(;)的例子来初探它们的区别吧!
方式一的示例:
(function(){ console.log('module1'); })()(function(){ console.log('module2'); })(); /* * 返回 module1 * 然后抛TypeError: undefined is not a function异常 */
方式二的示例:
(function(){ console.log('module1'); }())(function(){ console.log('module2'); }()); /* * 返回 module1 * 返回 module2 * 最后抛出TypeError: undefined is not a function异常 */
六、解构现象理解本质
首先要牢记一条规则:括号会马上执行其前面的表达式。下面让我们逐步分解这两个示例,好好理解一下吧!
方式一的示例分解:
1. 第一步先执行 (function(){console.log('module1');})() ,返回的结果是 undefined ,最后剩下将被执行的代码是 undefined(function(){console.log('module2');})(); ;
2. 第二步根据括号会马上执行其前面的表达式这一规则,将执行 undefined(function(){console.log('module');}) ,很明显undefined不是有效函数,这样的调用方式必须抛异常的。
方式二的示例分解:
1. 第一步先执行 function(){console.log('module1');}() ,返回结果是 (undefined) ,再经过括号运算符得到 undefined ,最后剩下将被执行的代码是 undefined(function(){console.log('module2');}()); ;
2. 第二步将执行function(){console.log('module2');}() ,返回结果是 undefined ,最后剩下将被执行的代码是 undefined(undefined); ;
3. 第三步当然是抛异常了!
七、提倡的使用方式
想避免因少写一个分号造成不必要的困扰,那么就像下面的那样写吧!
;(function(){ console.log('IIFE'); }());
原创文章,转载请注明来自^_^肥仔John[http://fsjohnhuang.cnblogs.com]
本文地址:http://www.cnblogs.com/fsjohnhuang/p/3755624.html (本篇完)
欢迎添加我的公众号一起深入探讨技术手艺人的那些事!
如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!