简单的JavaScript函数与立即调用不起作用...为什么?

Mik*_*eat 3 javascript function invocation

任何人都可以解释为什么这样有效:

var sayHello = function (name) {
   alert("Hello there " + name + "!");
}("Mike");
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

function sayHello (name) {
   alert("Hello there " + name + "!");
}("Mike");
Run Code Online (Sandbox Code Playgroud)

迈克皮特

kan*_*gax 13

这里你必须要了解的是Javascript中FunctionExpressionFunctionDeclaration之间的区别.

用括号括起函数时 -

(function sayHello (name) {
   alert("Hello there " + name + "!");
})("Mike");
Run Code Online (Sandbox Code Playgroud)

- 从技术上讲,您应用分组操作符.一旦应用,整体制作不再是FunctionDeclarataion,而是FunctionExpression.相比 -

function foo(){ } // FunctionDeclaration

(function foo(){ }); // FunctionExpresson
typeof function(){ }; // FunctionExpression
new function(){ }; // FunctionExpression
Run Code Online (Sandbox Code Playgroud)

FunctionExpression(违背FunctionDeclaration),就像任何其他MemberExpresson可以被附加参数("("和")"),将导致函数调用.这正是您在第一个示例中调用函数而不是在第二个示例中调用函数的原因.

请注意,FunctionExpression允许有可选的标识符(与FunctionDeclaration相反,它必须总是有一个),因此您可以轻松省略"sayHello"并最终得到所谓的匿名函数表达式 -

(function(){
  alert('...');
});
Run Code Online (Sandbox Code Playgroud)

您可以查看我关于命名函数表达式的文章,它更详细地深入研究了函数表达式和函数声明之间差异的细微细节.