我正在从这里学习 JavaScript 立即调用函数表达式 (IIFE) 。
在这个 Ben 很好地解释了为什么直接调用函数不起作用:
function(){ /* code */ }(); // SyntaxError: Unexpected token (
//since when the parser encounters the function keyword in
//the global scope or inside a function, it treats it as a
// function declaration (statement), and not as a function
// expression
所以我们只需要确保解析器将其解释为函数表达式而不是函数声明。
显而易见的方法是立即调用函数 - 将函数定义放在括号中(并因此强制解析器将其解释为函数表达式),然后再次将括号放在后面
(function(){ /* code */ })(); //or
(function(){ /* code */ }());
然而,作者解释了其他需要表达式的地方,这会强制将函数定义解释为函数表达式而不是声明:
var i = function(){ return 10; }();
true && function(){ /* code */ }();
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
但是我不明白为什么下面的函数定义被强制解释为表达式:
0, function(){ /* code */ }();
所以下面实际上调用了该函数:
0, function () { document.write("<h1>Hello World!!</h1> <br />") }(); //Hello World!!
工作的JSFiddle。