嵌套函数Javascript

时间:2013-02-15 07:38:30

标签: javascript ecmascript-5

在Javascript函数中,您需要将嵌套函数定义为函数表达式还是函数体中允许的函数声明?例如,这样的事情是否合规?

function a() {
    function b() {
        function c() {
            window.alert(3);
        }
        window.alert(2);
    }
    window.alert(1);
}

或者你必须做这样的事情吗?

function a() {
    var a = function () {
        var c = function () {
            window.alert(3);
        }
        window.alert(2);
    }
    window.alert(1);
}

ECMA-262说:

  

已知几种广泛使用的ECMAScript实现支持将FunctionDeclaration用作Statement。然而,在应用于此类FunctionDeclarations的语义中的实现之间存在显着且不可调和的变化。由于这些不可调和的差异,使用FunctionDeclaration作为Statement会导致代码在实现中无法可靠地移植。建议ECMAScript实现不允许使用FunctionDeclaration,或在遇到此类用法时发出警告。 ECMAScript的未来版本可以定义用于在Statement上下文中声明函数的替代可移植方法。

这是否意味着函数体中的函数声明在技术上是不正确的,还是我完全错了?我听说人们把身体称为一个块,根据标准,这是一个或多个陈述,但我不确定。

1 个答案:

答案 0 :(得分:5)

在函数体中肯定允许FunctionDeclaration,并且没有我知道的错误。

一旦你看ES5 production rules

,一切都很清楚
FunctionBody
  SourceElements (opt)

SourceElements
  SourceElement
  SourceElements SourceElement

SourceElement
  Statement
  FunctionDeclaration

换句话说,函数体包含源元素,源元素是Statement或FunctionDeclaration。因此,FunctionDeclaration可以是函数体的一部分。

您提到的“... ECMAScript的实现......已知支持将FunctionDeclaration用作语句”是指将FunctionDeclaration用作Statement,但不直接在函数体中使用。它指的是以下案例:

if (...) {
  function f () {}
}

这是一种非标准化的行为。详细了解这些function statements