当前位置: 首页 > 面试题库 >

JavaScript为什么需要在同一行上调用匿名函数?

狄英哲
2023-03-14
问题内容

我读了一些有关闭包的文章,到处都看到了,但是没有明确的解释-每次我被告知要使用它时……:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

好的,我看到我们将创建一个新的匿名函数,然后执行它。因此,在此之后,此简单的代码应该可以工作了(并且可以):

(function (msg){alert(msg)})('SO');

我的问题是这里发生了什么魔术?我以为在写的时候:

(function (msg){alert(msg)})

然后将创建一个新的未命名函数,如函数“”(msg)…

(function (msg){alert(msg)});
('SO');

为什么它需要在同一行?

您能给我一些帖子或给我一个解释吗?


问题答案:

将分号放在函数定义之后。

(function (msg){alert(msg)})
('SO');

以上应该工作。

编辑:

如果您查看ECMA脚本规范,则可以通过3种方式定义函数。(第98页的第13节“功能定义”)

1.使用函数构造函数

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2.使用函数声明。

function sum(a, b)
{
    return a + b;
}

alert(sum(10, 10)); //Alerts 20;

3.函数表达式

var sum = function(a, b) { return a + b; }

alert(sum(5, 5)); // alerts 10

所以您可能会问,声明和表达式之间有什么区别?

根据ECMA脚本规范:

FunctionDeclaration:函数标识符(FormalParameterListopt){FunctionBody}

FunctionExpression:function
Identifieropt(FormalParameterListopt){FunctionBody}

如果您注意到,“ identifier” 对于函数表达式是 可选 的。当您不提供标识符时,您将创建一个匿名函数。这并不意味着您无法指定标识符。

这意味着跟随是有效的。

var sum = function mySum(a, b) { return a + b; }

需要注意的重要一点是,只能在mySum函数主体内使用“ mySum”,而不能在外部使用。请参见以下示例

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise!

test1(); //alerts 'function' because test2 is a function.

比较一下

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

有了这些知识,让我们尝试分析您的代码

当您有类似的代码时,

    function(msg) { alert(msg); }

您创建了一个函数表达式。您可以通过将其包装在括号内来执行此函数表达式。

    (function(msg) { alert(msg); })('SO'); //alerts SO.


 类似资料:
  • 在java中,我们有一些方法来实现一些逻辑。那么匿名函数有什么用呢?当我们真的需要匿名函数时。

  • 本文向大家介绍什么是JavaScript中的自调用匿名函数?,包括了什么是JavaScript中的自调用匿名函数?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,用括号括起来的函数称为“立即调用函数表达式”或“自执行函数”。 包装的目的是为了命名空间并控制成员函数的可见性。它将代码包装在函数范围内,并减少了与其他库的冲突。这就是我们所说的立即调用函数表达式(IIFE)或自执行匿

  • 问题内容: 我在课堂上有这个功能: 我尝试使用此函数来调用该函数: 问题是编译器希望它看起来像这样: 为什么第一个会导致错误? 问题答案: Swift 2.0更新 :现在,默认情况下,函数的功能与方法相同,并且对于两种方法而言: 第一个参数没有外部名称;和 其他参数的外部名称与内部名称相同。 除此之外,下面的规则仍然适用,只是速记语法已消失。 这是一个更一般的答案:函数在类之外定义为真函数时以及在

  • 本文向大家介绍什么是JavaScript中的匿名函数?,包括了什么是JavaScript中的匿名函数?的使用技巧和注意事项,需要的朋友参考一下 函数表达式与函数声明相似,并且具有与函数声明相同的语法。可以定义“命名”函数表达式(例如,在调用堆栈中可能使用表达式的名称)或“匿名”函数表达式。 匿名函数表达式的示例(未使用名称)- 可以使用引用该函数的变量名来调用此函数- 总之,匿名函数是未存储但与变

  • php版本: 5.4 我定义了一个这样的函数 输出是 如何在的正文中引用。

  • 问题内容: 示例1中的问题是“ this”引用了全局名称而不是myName对象。 我了解在将this的值设置为特定对象时使用bind()的方法,因此它可以解决示例1中的问题,但是为什么首先会出现此问题?这仅仅是创建Javascript的方式吗? 我还想知道为什么示例3解决了这个问题,以及示例2和示例3之间的区别。 问题答案: 为什么需要JavaScript bind()? 值是决定 如何 一个功能