这几种立即执行函数表达式(IIFE)有什么区别?

今天看到IIFE的几种表达方式,

+ function () {
    //something
}();
(function () {
    //something
})();
(function () {
    //something
}());

这几种表达方式有什么具体的区别吗?

阅读 4.6k
4 个回答

2016.01.20更新 >>

很多同学啊,就是喜欢把简单问题复杂化!所谓立即执行函数,明明一句话就能概括:

就是定义了一个匿名函数,并且立即执行它。

它的好处是只用一次、用完无法再用、形成一个独立作用域(闭包)、不对外部环境造成污染等。

之所以加上各种括号、取反、加减号等稀奇古怪的符号,原因我下文说了,但是并不是为了对函数进行运算啊!谁闲着没事会对一个undefined进行各种奇怪的运算?有什么意义?

所以,讨论那些奇怪的操作符对函数的运算结果就本末倒置了!就把简单问题复杂化了。有空不如研究一下更有用的东西。

原答案 >>

个人觉得并没有什么区别,本来理论上应该是这样的:

function() {}();

但是这样不符合JS的语法规则,JS引擎不会把它当成一个函数表达式加一个括号,在语法分析的时候会报错。

所以,通过加上一个额外操作符的方法,告诉JS引擎这是一个函数表达式。

要非说区别的话就是:第一个附加了一个一元+操作符;后两个都是附加了分组运算符(),也就是圆括号,只是加的位置不同。

当然还有更多形式,其实除了加的操作不同外,并没有什么区别。因为你的根本目的是为了构造一个匿名函数并且立即执行它。

都是IIFE,没有什么大的区别。
但是,当有返回值有区别:

(function() {
  return true;
})(); // 返回true

!function () {
    return true;
}(); // 返回false

当函数没有return语句的时候,默认返回undefined,也会有返回值的差异:

!function(){}();  // => true
~function(){}(); // => -1
+function(){}(); // => NaN
-function(){}();  // => NaN
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏