javascript 中!function(){} 方法前面一个分号是啥意思

2014-09-04 16:23:45 +08:00
 frontman
经常在框架中看到 !function(){} 这样的表达式 不明觉厉 不知其意
15420 次点击
所在节点    程序员
34 条回复
bombless
2014-09-04 20:50:03 +08:00
分号和叹号是两种不同的情况……
分号的作用是在每行都不手打结尾的分号的情况下避开自动插入分号导致的解析错误
叹号类似加号、减号、new操作符什么的,可以少写一个括号(用new操作符的话函数调用的那对括号都省了)

这些手法都是依赖于js语法解析的细节。
Tonni
2014-09-04 21:51:10 +08:00
立即调用函数声明
codepiano
2014-09-04 21:57:49 +08:00
加个!号会被当成表达式解析,因此也就调用了该函数,和(function(){})()一样
Biwood
2014-09-04 22:01:20 +08:00
听到过一种解释:
分号是为了防止这段代码的前一段javascript代码结尾没有分号,避免运行时发生错误
leeiio
2014-09-04 23:07:58 +08:00
这不是叹号么...
yyfearth
2014-09-05 01:53:53 +08:00
@leeiio 他的意思应该是 `;!function(){...}`

目的是防止在minify合并行的时候由于前一行缺少分号导致错误 比如:
alert(1)
!function(){...}

合并后变成 alert(1)!function... 就syntax error了 加一个分号就好了 反正多一个没关系 少一个就不行
yyfearth
2014-09-05 01:57:51 +08:00
@tsingchao 应该是 (function(){}()) 或者 (function(){})() 两者等价

@digimoon 其实很简单 相当于你定义一个函数然后立即执行它:
var x = function() {....}; (或者 function x() {...}) 然后马上 x();
目的主要是为了避免污染全局变量 或者 为了使用闭包
acros
2014-09-05 02:01:16 +08:00
我想知道你们管右边这符号叫什么-> ;
luguozmy
2014-09-05 08:40:49 +08:00
人家明明问的是分号, 一帮人都在回答什么呀, 分号感叹号傻傻分不清楚
tsingchao
2014-09-05 09:58:53 +08:00
@yyfearth 加括号是立即执行 不谢
leejaen
2014-09-05 09:59:03 +08:00
这种tricky code 还是少写为好,技术不能用来秀的,达到要求才是最好的嘛。自己一个人懂不能保证团队里面其他人都懂,有可能会导致项目问题的。还有一些javascript的tricky code,比如with表达式、if(a=b){……}最好都别用,其他像左边大括号最好跟在行尾、每句要分号的一定要加上等也要遵守。这里应该号召大家讨伐写那代码的人。所以,写成最笨的(function(){……})();我觉得挺好。
54c3
2014-09-05 12:25:40 +08:00
@digimoon 這種叫 Immediately-Invoked Function Expression (IIFE),見: http://weizhifeng.net/immediately-invoked-function-expression.html
frontman
2014-09-05 14:31:27 +08:00
@NemoAlex 哈哈 你的钻眼 小生立马就改
frontman
2014-09-05 14:38:57 +08:00
为何现在改不了标题了 是感叹号 当时打错了 不过大家都回答的是感叹号 非常感谢大家 已经明了了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/131730

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX