【问题标题】:Named vs unnamed functions in javascript and understanding allocationjavascript中的命名函数与未命名函数以及理解分配
【发布时间】:2016-04-23 18:36:35
【问题描述】:

当您查看 ECMAScript 6 specification 时,我发现了一些有趣的东西。

13 函数定义

语法

FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }

FunctionExpression : function Identifieropt (FormalParameterListopt ) { FunctionBody }

这两种不同的声明类型进一步细分为以下语义定义:

产生式FunctionExpression : function ( FormalParameterListopt ) { FunctionBody } 评估如下:

返回创建新 Function 对象的结果,如 13.2 参数由FormalParameterListopt 指定,正文由FunctionBody 指定。传入LexicalEnvironment的 运行执行上下文作为范围。传入true 作为 Strictflag 如果FunctionExpression 包含在strict 代码中 或者如果它的FunctionBodystrict 代码。

还有:

产生式FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }实例化如下 在声明绑定实例化期间(10.5):

返回创建新 Function 对象的结果,如 13.2 参数由FormalParameterListopt 指定,正文由FunctionBody 指定。传入VariableEnvironment 的 运行执行上下文作为范围。以 Strict 的形式传入 true 如果FunctionDeclaration 包含在strict 代码中,或者如果 它的FunctionBodystrict 代码。

我将其解释为声明是否正确

function foo(){};

被定义为本质上在“函数表”中声明,其中所有参数和变量在加载执行上下文时分配在堆栈上,而

function (){};

在它被解析执行的那一刻之前基本上不存在,它的所有变量和范围都继承自相关的本地执行上下文?

或者用外行的话来说,命名声明是预先分配的,而匿名声明是在“运行时”分配的?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    这里的重要性不是命名函数和未命名函数的区别,而是FunctionDeclaration vs FunctionExpression

    函数声明采用以下形式:

    function foo() {...}
    

    注意函数关键字的位置,前面没有运算符。这种风格是 hoisted 到当前上下文的顶部,在运行时可用,允许你说:

    foo();
    function foo() {console.log("Foo was called");}
    

    另一方面,如果您在function 关键字前面放置任何类型的运算符,例如=(,它就会变成一个函数表达式。函数表达式只有在它们被求值时才可用。

    foo(); // can't call it it here. `foo` exists due to hoisting, but it is `undefined`
    var foo = function() {console.log("foo was called");}
    foo();
    

    【讨论】:

    • "函数表达式在执行前不可用" - 这是不正确的。一旦表达式被评估,“函数”(一个对象......)就可用。
    • 这是表达我想说的更好的方式。我更新了我的答案。谢谢。
    【解决方案2】:

    FunctionDeclaration”是一个语句,而“FunctionExpression”是一个表达式。

    函数声明语句和函数表达式之间的最大区别在于函数对象的实例化时间以及该函数的可用范围。

    函数标识符(“名称”)是语句的要求,对于表达式是可选的。

    在这两种情况下,函数仅在调用时执行,但作为脚本静态分析的一部分进行解析 - 例如,如果函数表达式包含无效语句,则会抛出解析错误,脚本不会执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2010-09-29
      • 2010-09-14
      • 2017-11-27
      • 1970-01-01
      • 2019-09-03
      • 2013-01-21
      相关资源
      最近更新 更多