意译:自调用函数表达式

简介:

原文地址: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 (本篇完)

 

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/p/3755624.html,如需转载请自行联系原作者


相关文章
|
27天前
|
算法 编译器 C语言
函数—C(下)
函数—C(下)
28 0
|
1月前
|
存储 编译器 Serverless
C++系列十:函数
C++系列十:函数
|
4月前
|
人工智能
函数练习
用菜单的形式分别选择百钱买百鸡,九九表,水仙花数。
21 0
|
4月前
|
存储 编译器
函数(下)
函数(下)
60 0
函数加强
在我们日常开发中,如果要遍历一个文件夹下的所有文件,通常使用递归来实现;
|
JavaScript 前端开发 API
h函数为什么叫h?
h函数为什么叫h?
198 0
|
SQL 分布式计算 关系型数据库
not_in函数致错
Not in 函数-致错 我们开发当中有些业务逻辑会用到not in()这个函数, 岗位角度:不管是后端开发还是大数据开发还是数据分析师… 技术角度:不管是Mysql、Hive、Maxcompute…
121 0
|
算法 Go
函数
函数
72 0
|
编译器
函数部分1
C的设计思想:把函数用作构建块。我们使用过标准库函数,如 printf() scanf()……现在我们进一步学习创建属于自己的函数模块。
97 0