你看到的感叹号一般是在压缩过的js文件里面,因为在匿名函数调用的时候,通常我们都是用:
(function(){})()
的形式,但也可以使用另一种形式:!function(){}() 前面的!号可以换成-+~等等一元操作符,从而省下了1字节。
分号加与不加完全取决于个人习惯,但为了代码稳定(解析出错)还是建议使用分号断句。JavaScript自动加分号规则:
1.当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
2.当有}时,如果缺少分号,会补分号。
3.当程序源代码结束时,如果缺少分号,会补分号。
结论:
1.在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
2.var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
3.凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
4.凡(和[开头的语句,前面不加分号极度危险。
通常是用在立即调用之前。但是并不是因为他是立即调用函数,而是为了文件合并的安全。
比如你有两个文件,a.js 和 b.js,里面都是一个立即调用函数:
// a.js( function() {} )() // b.js
( function() {} )()
如果你在构建过程中把两个文件压缩之后连接到一起,就变成了
( function() {} )()( function() {} )()这样就出了问题,所以为了避免这个问题,你可以在 b.js 最前面加一个分号。
( function() {} )()( function() {} )()很多第三方 JS 库需要考虑各种被使用的情况,所以前面可能会写个分号。