2011-01-24 84 views
0
function outer(x) { 
    function inner(y) { 
     if (y) console.log(y); 
     else console.log(42); 
    } 
    inner(x + 1); 
} 
outer(5); // expect a logging of '6' 
inner(); // expect a Reference Error 

我知道它應該做什麼,我期望它能做到這一點,但是在聲明內部函數時我應該知道任何跨瀏覽器的怪癖或副作用。內部函數聲明是否安全?

[編輯]

通過安全我的意思是有可能他們污染全局命名空間或不被視爲是本地的,他們在被宣佈的功能。

[/編輯]

回答

1

AFAIK沒有。 IE與有名函數表達式樣的問題:

var inner = function inner2() { 

} 

,但一切應罰款。

+0

當用作內部函數時,是否將命名函數表達式將函數`inner`的作用域提升爲全局命名空間? – Raynos 2011-01-24 10:15:28

+0

@Raynos:不,IE只是創建兩個函數,而不是一個,但它們保持在同一個範圍內。 – 2011-01-24 10:20:57

0

這是常規的ECMAScript語法。它允許關閉和「內部功能」。函數內的語句(函數聲明和var)在該函數中作用域。

在您的示例中,功能inner僅在outer的範圍內存在;當嘗試撥打inner()時,除參考錯誤之外的任何內容均應被視爲「怪癖」。


UPDATE:Found a question可能與此相關的一個。

0

我不確定「安全」是什麼意思。 在你的例子中,沒有辦法從outer()以外調用inner()。如果「安全」 - 意味着只有功能可見性,那麼你是對的,這是安全的。