3

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

var sayHello = function (name) {
   alert("Hello there " + name + "!");
}("Mike");

虽然这不会:

function sayHello (name) {
   alert("Hello there " + name + "!");
}("Mike");

迈克·皮特

4

6 回答 6

13

您需要了解的只是Javascript 中FunctionExpressionFunctionDeclaration之间的区别。

当你用括号括起函数时 -

(function sayHello (name) {
   alert("Hello there " + name + "!");
})("Mike");

- 从技术上讲,您对其应用分组运算符。一旦应用,整体生产不再是FunctionDeclarataion,而是FunctionExpression。相比 -

function foo(){ } // FunctionDeclaration

(function foo(){ }); // FunctionExpresson
typeof function(){ }; // FunctionExpression
new function(){ }; // FunctionExpression

FunctionExpression(与FunctionDeclaration相反),就像任何其他MemberExpresson可以附加参数(“(”和“)”),并将导致函数调用。这正是为什么在您的第一个示例中而不是在第二个示例中调用函数的原因。

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

(function(){
  alert('...');
});

您可以查看我关于命名函数表达式的文章,该文章更详细地探讨了函数表达式和函数声明之间差异的细微细节。

于 2009-08-19T12:34:01.413 回答
4

您的第二个代码实际上是:

function sayHello (name) {
   alert("Hello there " + name + "!");
}

("Mike");

因此,您首先声明函数“sayHello”,然后执行“语句”:

("Mike");

什么都不做。

于 2009-08-19T10:52:50.247 回答
3

这将起作用:

    (function sayHello (name) {
        alert("Hello there " + name + "!");
     })("Mike");

注意包裹函数本身的括号。您也可以删除函数名称“sayHello”,它仍然可以工作。至于为什么?我不积极。也许通过将它分配给一个变量而不使用包装(),你实际上是把它分配给 sayHello 然后在 say hello 上执行,而不是匿名函数。

于 2009-08-19T10:57:03.983 回答
1
var sayHello = function (name) {
   alert("Hello there " + name + "!");
}("Mike");

这将创建一个匿名函数并立即使用“Mike”参数调用它。然后将该函数调用的返回值分配给变量sayHello

function sayHello (name) {
   alert("Hello there " + name + "!");
}("Mike");

这只是定义了一个带有名称的普通函数,sayHello函数语句在结束 } 之后结束。然后是有效的 ("Mike") 语句,但什么也不做。

于 2009-08-19T10:59:45.087 回答
0

编辑是因为我的回答错误地阅读了原始帖子:

由于您的函数不再作为 lambda 函数分配给一个值,因此之后使用 ("Mike") 调用该函数将不起作用,因为没有调用该调用的值。正如其他人建议的那样,用括号将其包装起来以创建一个临时变量仍然可以让您调用匿名函数:

(function sayHello (name) {
   alert("Hello there " + name + "!");
})('Mike');
于 2009-08-19T10:49:00.083 回答
0

()在调用它之前包围函数定义:

(function sayHello(name) {
   alert("Hello there " + name + "!");
})("Mike");

// however -- 
alert(typeof sayHello);  // undefined

因此,如果您想做类似的事情-您不妨将其设为匿名函数:

(function(name) {
   alert("Hello there " + name + "!");
})("Mike");

而且我不确定它是否需要 - 但为了安全起见 - 每当我使用这样的封闭装置时,我总是将它包裹起来()

于 2009-08-19T10:58:18.350 回答