今天看到IIFE的几种表达方式,
+ function () {
//something
}();
(function () {
//something
})();
(function () {
//something
}());
这几种表达方式有什么具体的区别吗?
今天看到IIFE的几种表达方式,
+ function () {
//something
}();
(function () {
//something
})();
(function () {
//something
}());
这几种表达方式有什么具体的区别吗?
都是IIFE,没有什么大的区别。
但是,当有返回值有区别:
(function() {
return true;
})(); // 返回true
!function () {
return true;
}(); // 返回false
当函数没有return语句的时候,默认返回undefined,也会有返回值的差异:
!function(){}(); // => true
~function(){}(); // => -1
+function(){}(); // => NaN
-function(){}(); // => NaN
基本同意 @LionKissDeer 的回答~
更多补充可以参见 葵中剑@剑空 的BLOG:http://swordair.com/function-and-exclamation-mark/
27 回答12.9k 阅读
8 回答3.4k 阅读✓ 已解决
6 回答1k 阅读✓ 已解决
5 回答5.2k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
3 回答1.7k 阅读
4 回答2.1k 阅读✓ 已解决
2016.01.20更新 >>
很多同学啊,就是喜欢把简单问题复杂化!所谓立即执行函数,明明一句话就能概括:
它的好处是只用一次、用完无法再用、形成一个独立作用域(闭包)、不对外部环境造成污染等。
之所以加上各种括号、取反、加减号等稀奇古怪的符号,原因我下文说了,但是并不是为了对函数进行运算啊!谁闲着没事会对一个undefined进行各种奇怪的运算?有什么意义?
所以,讨论那些奇怪的操作符对函数的运算结果就本末倒置了!就把简单问题复杂化了。有空不如研究一下更有用的东西。
原答案 >>
个人觉得并没有什么区别,本来理论上应该是这样的:
但是这样不符合JS的语法规则,JS引擎不会把它当成一个函数表达式加一个括号,在语法分析的时候会报错。
所以,通过加上一个额外操作符的方法,告诉JS引擎这是一个函数表达式。
要非说区别的话就是:第一个附加了一个一元
+
操作符;后两个都是附加了分组运算符()
,也就是圆括号,只是加的位置不同。当然还有更多形式,其实除了加的操作不同外,并没有什么区别。因为你的根本目的是为了构造一个匿名函数并且立即执行它。