2013-02-15 99 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