9

在 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 用作语句。然而,在应用于此类 FunctionDeclarations 的语义中,实现之间存在显着且不可调和的变化。由于这些不可调和的差异,将 FunctionDeclaration 用作 Statement 会导致代码在实现之间不能可靠地移植。建议 ECMAScript 实现要么禁止 FunctionDeclaration 的这种用法,要么在遇到这种用法时发出警告。ECMAScript 的未来版本可能会定义替代的可移植方式,用于在 Statement 上下文中声明函数。

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

4

1 回答 1

5

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

看看ES5 生产规则就很清楚了

FunctionBody
  SourceElements (opt)

SourceElements
  SourceElement
  SourceElements SourceElement

SourceElement
  Statement
  FunctionDeclaration

也就是说,函数体包括源元素,源元素要么是Statement,要么是FunctionDeclaration。因此 FunctionDeclaration 可以是函数体的一部分。

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

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

那是一种非标准化的行为。查看更多关于这些函数语句的信息。

于 2013-02-15T13:25:14.100 回答