繁体   English   中英

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

[英]Simple JavaScript function with immediate invocation does not work… why?

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

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

虽然这不是:

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

迈克皮特

这里你必须要了解的是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允许有可选的标识符 (与FunctionDeclaration相反,它必须总是有一个),因此您可以轻松省略“sayHello”并最终得到所谓的匿名函数表达式 -

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

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

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

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

("Mike");

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

("Mike");

什么都不做。

这将有效:

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

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

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

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

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

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

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

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

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

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

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

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

所以,如果你想做类似的事情 - 你可能只是让它成为一个匿名函数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM