Airbnd 建议我这样做:
!function() {
// ...
}();
因为:
这确保了如果格式错误的模块忘记包含最后的分号,则在连接脚本时不会在生产中出错。
bang 让我可以绕过语言的语法规则:
// 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 !
似乎以分号开头的 IIFE 更好。
;(function() {
// ...
}());
!function(){}();(function(){}()); // => undefined
(function(){}());(function(){}()); // => undefined
!function(){}();;(function(){}()); // => undefined
(function(){}());;(function(){}()); // => undefined
我错过了什么吗?使用 bang "!" 真的可以接受吗?函数或前导分号“;” IIFE 真正优越是因为它们的连接方式吗?