这几种立即执行函数表达式(IIFE)有什么区别?
今天看到IIFE的几种表达方式,
+ function () {
//something
}();
(function () {
//something
})();
(function () {
//something
}());
这几种表达方式有什么具体的区别吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
2016.01.20更新 >>
很多同学啊,就是喜欢把简单问题复杂化!所谓立即执行函数,明明一句话就能概括:
它的好处是只用一次、用完无法再用、形成一个独立作用域(闭包)、不对外部环境造成污染等。
之所以加上各种括号、取反、加减号等稀奇古怪的符号,原因我下文说了,但是并不是为了对函数进行运算啊!谁闲着没事会对一个undefined进行各种奇怪的运算?有什么意义?
所以,讨论那些奇怪的操作符对函数的运算结果就本末倒置了!就把简单问题复杂化了。有空不如研究一下更有用的东西。
原答案 >>
个人觉得并没有什么区别,本来理论上应该是这样的:
但是这样不符合JS的语法规则,JS引擎不会把它当成一个函数表达式加一个括号,在语法分析的时候会报错。
所以,通过加上一个额外操作符的方法,告诉JS引擎这是一个函数表达式。
要非说区别的话就是:第一个附加了一个一元
+
操作符;后两个都是附加了分组运算符()
,也就是圆括号,只是加的位置不同。当然还有更多形式,其实除了加的操作不同外,并没有什么区别。因为你的根本目的是为了构造一个匿名函数并且立即执行它。
都是IIFE,没有什么大的区别。
但是,当有返回值有区别:
当函数没有return语句的时候,默认返回undefined,也会有返回值的差异:
基本同意 @LionKissDeer 的回答~
更多补充可以参见 葵中剑@剑空 的BLOG:http://swordair.com/function-and-exclamation-mark/
具体可以参考这里:
http://segmentfault.com/a/1190000000523767