2013-02-15 4 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 в качестве Statement приводит к тому, что код, который не надежно переносится среди реализаций. Рекомендуется, чтобы реализации ECMAScript либо запрещали это использование FunctionDeclaration, либо выдавали предупреждение, когда такое использование встречается. Будущие выпуски ECMAScript могут определять альтернативные переносные средства для объявления функций в контексте Statement.

Означает ли это, что объявление функции в теле функции технически неверно, или я получил это совершенно неправильно? Я слышал, что люди называют тело блоком, который, согласно стандарту, является одним или несколькими утверждениями, но я не уверен.

+2

Я не уверен, что такое стандарт, кажется немного запутанным, но, честно говоря, у меня никогда не было проблем с вложением объявлений функций в IE8 + и во всех других браузерах. – elclanrs

ответ

5

Функциональные функции, безусловно, разрешены в функциональном теле, и я не знаю об ошибках.

Это все довольно ясно, как только вы посмотрите на ES5 production rules

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

Другими словами, тело функции включает в себя исходные элементы, а исходный элемент является либо заявление или FunctionDeclaration. Следовательно, FunctionDeclaration может быть частью тела функции.

Статья, о которой вы упомянули о «... реализациях ECMAScript ..., известных как поддержка использования FunctionDeclaration в качестве заявления», относится к использованию FunctionDeclaration в качестве Statement, но не непосредственно к телу функции. Это относится к таким случаям, как:

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

Это нестандартное поведение. Узнайте больше об этих function statements.

+0

Wow - Kangax - круто. Я правильно помню, что что-то видел на странице ES.next о том, что вы делаете объявления уровня блока, как эта часть спецификации языка? –

+0

Да, я думаю, они пытаются стандартизировать это. IIRC также были некоторые изменения в последних двигателях в строгом режиме. – kangax