2017-04-19 62 views
0

在書中You Don't Know JS: Scope & Closures有這樣的代碼我不完全理解。有條件的函數聲明

「出現正常的區塊內通常舉到封閉的範圍,而不是有條件的,因爲這意味着代碼函數聲明:」

foo(); // "b" 

var a = true; 
if (a) { 
    function foo() { console.log("a"); } 
} 
else { 
    function foo() { console.log("b"); } 
} 

是什麼意思?這怎麼可能?條件不起作用嗎?

+1

引用的語句不正確。 – RobG

+1

*「這是什麼意思?」*這意味着功能聲明與其他地方一樣懸而未決。 *「條件不起作用嗎?」*正在工作,但在任何代碼執行之前發生提升。這實際上更復雜,因爲塊內的函數*聲明實際上是無效的。然而瀏覽器允許它們實現不同的行爲。請參閱[爲什麼函數聲明在不同的瀏覽器中處理方式不同?](http://stackoverflow.com/q/8871974/218196) –

+0

如果您執行了'var a = true; const foo = a? ()=> console.log('a'):()=> console.log('b'); foo();'然後控制檯會記錄'a',因爲'foo'不會被掛起。 – Josep

回答

0

這是因爲函數聲明被javascript解析器移動到文件的頂部。這就是他們提出的意思。 foo的最後一個聲明會在第一次掛起時覆蓋第一個聲明。

+1

你的解釋不正確。函數聲明不允許在塊內部,所以一些瀏覽器「掛起」它們,有些則沒有(將它們當作函數聲明,是對ECMA-262的擴展),有些則拋出錯誤。目前規範中的行爲已經或多或少地標準化了,但是它們的使用是令人沮喪的。請參閱[*重複鏈接*](http://stackoverflow.com/questions/43135925/why-javascript-function-declaration-behave-differently-in-chrome-and-safari)。 – RobG

+0

@RobG - 這是不正確的。請參閱此頁上有關功能託管的部分: http://adripofjavascript.com/blog/drips/variable-and-function-hoisting –

+0

特別是,在該頁面上,您可以搜索'isItHoisted'並查看功能和解釋。 –