2013-02-15 94 views
9

在JavaScript函数,你需要定义嵌套函数的函数表达式或允许在一个函数体的函数声明?例如,这样的事情是否符合?嵌套函数的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作为语句。然而,在应用于这些函数声明的语义中,这些实现之间存在重大且不可调和的变化。因为这些不可调和的差异,使用FunctionDeclaration作为在代码语句的结果是未实施方式中可靠地便携式的。建议ECMAScript实现禁止任何的FunctionDeclaration这种用法或遇到这样的使用情况时发出警告。 ECMAScript的未来版本可以定义用于在语句上下文中声明函数的可选便携式方法。

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

+2

我不知道标准是什么,似乎有点混乱,但老实说,我从来没有问题,IE8 +和所有其他的浏览器嵌套函数声明。 – elclanrs 2013-02-15 07:47:14

回答

5

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

这一切都非常清楚,一旦你看ES5 production rules

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

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

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

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

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

+0

哇 - Kangax - 酷。难道我记错看到ES.next页关于实际进行块级别的函数声明,如语言规范,这部分的东西吗? – 2013-02-15 16:09:47

+0

是的,我认为他们正在努力将此标准化。 IIRC在严格模式下最新发动机也有所变化。 – kangax 2013-02-15 20:09:31