2017-02-12 118 views
0

本地定義的函數我有這樣的代碼片段:範圍在JavaScript

sayHi() 

if (1) { 
    function sayHi() { alert(1) } 
} else { 
    function sayHi() { alert(2) } // <-- 
} 

它是如何真正起作用?這些函數在if/else塊中定義。那麼它們如何在if/else塊之外進行限定呢?

+1

他們不是。當我運行它時,我得到'TypeError:sayHi不是函數' – bejado

+0

這個問題似乎很不清楚......... –

回答

0

所有內容都在Javascript的功能級別範圍內,而不是像大多數其他語言一樣在塊級別上。因此,如果您在for循環中定義var,它將被「懸掛」到包含函數的頂部。

+0

這不完全正確。 'var'和'function'聲明是函數範圍的,但'let','const'和'class'聲明是塊範圍的。 – Frxstrem

1

該函數的作用域是整個包含函數,因爲函數聲明被掛起。但是,在執行ifelse塊之前,函數沒有爲其定義分配給它。它相當於:

var sayHi; 
sayHi(); 

if (1) { 
    sayHi = function() { alert(1); }; 
} else { 
    sayHi = function() { alert(2); }; 
}