您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

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

解析器根据它出现的 *

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

另一方面,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 2022/1/1 18:16:43 有572人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶