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

时间:2009-08-19 10:46:25

标签: javascript function invocation

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

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

虽然这不是:

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

Mike Peat

6 个答案:

答案 0 :(得分:13)

这里你需要了解的是Javascript中 FunctionExpression FunctionDeclaration 之间的区别。

用括号括起函数时 -

(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 一样,可以附加 Arguments (“ (“和”)“)将导致函数调用。这就是为什么在第一个例子中调用函数而不是在第二个例子中调用函数的原因。

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

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

你可以查看my article on named function expressions,它更详细地深入研究了函数表达式和函数声明之间的细微差别。

答案 1 :(得分:4)

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

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

("Mike");

所以你首先声明函数“sayHello”,然后你执行“声明”:

("Mike");

什么也没做。

答案 2 :(得分:3)

这将有效:

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

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

答案 3 :(得分:1)

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

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

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

这只是定义一个名为sayHello的普通函数,函数语句在结束后结束}。 然后遵循(“Mike”)语句,该语句有效,但什么都不做。

答案 4 :(得分:0)

编辑,因为我的回答错误地读了原帖:

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

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

答案 5 :(得分:0)

在调用它之前围绕()中的函数定义:

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

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

所以如果你想做那样的事情 - 你也可以把它变成匿名函数:

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

而且我不确定它是否必需 - 但为了安全 - 任何时候我都使用类似的闭包我总是把它包裹在()