Airbnb建议我这样做:
!function() {
// ...
}();
原因是:
这样可以确保如果一个格式错误的模块忘记包含最后的分号,那么当脚本被合并时,生产环境中就不会出现错误。
感叹号允许我规避语言语法规则:
// Evaluated in Chromium 34 console.
function(){}(); // => SyntaxError: Unexpected token (
!function(){}(); // => true
当连接其他模块时,感叹号似乎可以解决问题:
!function(){}();function(){}(); // => SyntaxError: Unexpected token (
!function(){}();!function(){}(); // => true
(function(){}());!function(){}(); // => true
然而,实际上它并不是“安全”的,因为如果其他人的脚本末尾没有一个分号:
!function(){}()!function(){}(); // => SyntaxError: Unexpected token !
(function(){}())!function(){}(); // => SyntaxError: Unexpected token !
看起来,使用前导分号的立即调用函数表达式更好。
;(function() {
// ...
}());
!function(){}();(function(){}()); // => undefined
(function(){}());(function(){}()); // => undefined
!function(){}();;(function(){}()); // => undefined
(function(){}());;(function(){}()); // => undefined
我有所疏漏吗?使用感叹号 "!" 函数是否可接受,还是前导分号 ";" 的IIFE真的更好,因为它们的连接方式更好?
!
,以使其作为函数表达式进行评估...另外,“前导分号是决定性因素”到底是什么意思? - jahroy