4

只有函数表达式可以立即调用:

(function () {
    var x = "Hello!!";      // I will invoke myself
})();

但不是函数声明?这是因为函数声明被提升并且已经立即执行了吗?

编辑:我引用的资源

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

http://markdalgleish.com/presentations/gettingclosure/

4

3 回答 3

3

来源

“...虽然放在表达式之后的括号表示表达式是要调用的函数,但放在语句之后的括号与前面的语句完全分开,并且只是一个分组运算符(用作控制评估优先级的一种手段)。”

// 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() {})();

因为这告诉解析器将其评估为函数表达式而不是函数声明。然后你所做的就是立即调用表达式。

于 2017-03-01T20:46:48.840 回答
2

为了消除混乱

什么是函数声明

// 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 与函数的结果一起存储(如果从函数返回)并丢失对函数的引用。

在这两种情况下,您都可以立即调用一个函数,但结果与上述不同。

于 2014-10-13T07:38:39.713 回答
1

不确定您的确切含义-如果您以显示的方式运行函数声明,它仍将立即执行

(function declaredFn(){
  document.getElementById('result').innerHTML='executed';
}());
<div id="result"></div>

于 2014-10-13T07:21:54.947 回答