我正在从here了解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。