只有函数表达式可以立即调用:
(function () {
var x = "Hello!!"; // I will invoke myself
})();
但不是函数声明?这是因为函数声明被提升并且已经立即执行了吗?
编辑:我引用的资源
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
只有函数表达式可以立即调用:
(function () {
var x = "Hello!!"; // I will invoke myself
})();
但不是函数声明?这是因为函数声明被提升并且已经立即执行了吗?
编辑:我引用的资源
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
来源:
“...虽然放在表达式之后的括号表示表达式是要调用的函数,但放在语句之后的括号与前面的语句完全分开,并且只是一个分组运算符(用作控制评估优先级的一种手段)。”
// While this function declaration is now syntactically valid, it's still
// a statement, and the following set of parens is invalid because the
// grouping operator needs to contain an expression.
function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
// Now, if you put an expression in the parens, no exception is thrown...
// but the function isn't executed either, because this:
function foo(){ /* code */ }( 1 );
// Is really just equivalent to this, a function declaration followed by a
// completely unrelated expression:
function foo(){ /* code */ }
( 1 );
因此,您需要将函数编写为
(function doSomething() {})();
因为这告诉解析器将其评估为函数表达式而不是函数声明。然后你所做的就是立即调用表达式。
为了消除混乱
什么是函数声明
// this is function declaration
function foo(){
// code here
}
或者
//this is ok, but without name, how would you refer and use it
function (){
// code here
}
立即调用它,你这样做
function foo(){
// code here
}()
什么是函数表达式
// this is a function expression
var a = function foo(){
// code here
};
或者
var a = function (){
// code here
};
在第二种情况下,您创建了一个匿名函数。您仍然可以通过变量引用该函数。所以a
您可以这样做a()
。
调用函数表达式
var a = (function (){
// code here
}());
变量 a 与函数的结果一起存储(如果从函数返回)并丢失对函数的引用。
在这两种情况下,您都可以立即调用一个函数,但结果与上述不同。
不确定您的确切含义-如果您以显示的方式运行函数声明,它仍将立即执行
(function declaredFn(){
document.getElementById('result').innerHTML='executed';
}());
<div id="result"></div>