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

JavaScript解释封装的匿名函数语法

干弘深
2023-03-14
问题内容

摘要

您能解释JavaScript中封装的匿名函数的语法背后的原因吗?为什么起作用:(function(){})();但这不起作用function(){}();

我知道的

在JavaScript中,将创建一个命名函数,如下所示:

function twoPlusTwo(){
    alert(2 + 2);
}
twoPlusTwo();

您还可以创建一个匿名函数并将其分配给变量:

var twoPlusTwo = function(){
    alert(2 + 2);
};
twoPlusTwo();

您可以通过创建一个匿名函数来封装代码块,然后将其包装在方括号中并立即执行

(function(){
    alert(2 + 2);
})();

在创建模块化脚本时,这很有用,以避免因潜在冲突的变量而使当前范围或全局范围混乱(例如Greasemonkey脚本,jQuery插件等)。

现在,我明白了为什么这样做了。方括号将内容括起来,仅显示结果(我敢肯定有一种更好的描述方式),例如with (2 + 2) === 4

我不明白的

但是我不明白为什么这不能同样有效:

function(){
    alert(2 + 2);
}();

你能跟我解释一下吗?


问题答案:

它不起作用,因为它被解析为a FunctionDeclaration ,并且函数声明的名称标识符是 强制性的

当用括号将其括起来时,它将被评估为 FunctionExpression ,并且可以命名或不命名函数表达式。

a的语法FunctionDeclaration如下:

function Identifier ( FormalParameterListopt ) { FunctionBody }

FunctionExpressions:

function Identifieropt ( FormalParameterListopt ) { FunctionBody }

如您所见,Identifier(Identifieropt)令牌FunctionExpression是可选的,因此我们可以使用没有定义名称的函数表达式:

(function () {
    alert(2 + 2);
}());

命名 函数表达式:

(function foo() {
    alert(2 + 2);
}());

括号(正式称为[分组运算符)只能包围表达式,并且会评估函数表达式。

这两个语法产生可能会模棱两可,并且看起来可能完全相同,例如:

function foo () {} // FunctionDeclaration

0,function foo () {} // FunctionExpression

解析器根据它出现的 上下文* 知道它是a FunctionDeclaration还是a 。FunctionExpression *

在上面的示例中,第二个是表达式,因为逗号运算符也只能处理表达式。

另一方面,FunctionDeclarations实际上只能出现在所谓的“
Program”代码中,这意味着代码在全局范围之外以及在FunctionBody其他函数的内部。

应该避免在块内部使用函数,因为它们会导致不可预测的行为,例如:

if (true) {

  function foo() {

    alert('true');

  }

} else {

  function foo() {

    alert('false!');

  }

}



foo(); // true? false? why?

上面的代码实际上应该产生一个SyntaxError,因为aBlock只能包含语句(并且ECMAScript规范没有定义任何函数语句),但是大多数实现是可以容忍的,并且将仅采用第二个函数,即alert的第二个函数'false!'

Mozilla实现-Rhino,SpiderMonkey-具有不同的行为。它们的语法包含一个非标准Function语句,这意味着该函数将在
运行时而 不是在解析时进行评估,因为它会与FunctionDeclarations一起发生。在这些实现中,我们将定义第一个函数。

可以用不同的方式声明函数,请比较以下内容:

1-一个函数,该函数使用分配给变量的Function构造函数
乘法

var multiply = new Function("x", "y", "return x * y;");

2-名为 乘法 的函数的函数声明:

function multiply(x, y) {
    return x * y;
}

3-分配给变量 multipli的 函数表达式:

var multiply = function (x, y) {
    return x * y;
};

4-命名函数表达式 func_name ,分配给变量 multipli

var multiply = function func_name(x, y) {
    return x * y;
};


 类似资料:
  • 本文向大家介绍使用匿名函数的JavaScript封装,包括了使用匿名函数的JavaScript封装的使用技巧和注意事项,需要的朋友参考一下 面向对象的编程语言允许使用私有字段隐藏数据。他们使用这些来隐藏类的内部。在JS中,没有这样的构建支持来隐藏/封装内部工作。 我们有Anonymous函数,可以为您封装JS。让我们看一个例子- 示例 如果我们将上面的代码公开地写出来,则此代码将使用这些名称污染全

  • 本文向大家介绍jquery封装插件时匿名函数形参和实参的写法解释,包括了jquery封装插件时匿名函数形参和实参的写法解释的使用技巧和注意事项,需要的朋友参考一下  在jquery插件中我们经常看到以下这段代码 1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。 2、匿名函数(function(){})();:由于Javascript执行表达式

  • 本文向大家介绍封装了一个支持匿名函数的Javascript事件监听器,包括了封装了一个支持匿名函数的Javascript事件监听器的使用技巧和注意事项,需要的朋友参考一下 关于js中的事件监听大家用的比较多了,无非是判断浏览器是否支持addEventListener和attachEvent,网上搜索关于事件监听的方法也挺多,但是总有些不是很完善。下面的方法中对于添加事件监听的方法是一样的,只不过在

  • 主要内容:定义一个匿名函数,匿名函数用作回调函数,使用匿名函数实现操作封装Go语言支持匿名函数,即在需要使用函数时再定义函数,匿名函数没有函数名只有函数体,函数可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递,这与C语言的回调函数比较类似,不同的是,Go语言支持随时在代码里定义匿名函数。 匿名函数是指不需要定义函数名的一种函数实现方式,由一个不带函数名的函数声明和函数体组成,下面来具体介绍一下匿名函数的定义及使用。 定义一个匿名函数 匿名函数的定义格

  • 问题内容: 我有一个包含方法的对象。这些方法被放入匿名函数内部的对象中。看起来像这样: (还有很多代码,但这足以显示问题) 现在,在某些情况下,我想停止事件监听器。因此,我试图做一个removeEventListener,但我不知道如何去做。我已经读过其他问题,无法在匿名函数上调用removeEventListener,但是在这种情况下也是如此吗? 我在匿名函数内部创建了一个t方法,因此我认为这是

  • 本文向大家介绍JavaScript匿名函数用法分析,包括了JavaScript匿名函数用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript匿名函数用法。分享给大家供大家参考。具体如下: 一、定义一个函数 在JavaScript中,可以通过“函数声明”和“函数表达式”来定义一个函数,比如 1、通过“函数声明”来定义一个函数 2、通过“函数表达式”来定义一个函数 但是两