console.log(f);//function f(){return 1}
function f(){
return 1
}
var f=2;
之前以為如果函數和變數同名 ,函數宣告提升會覆蓋變數宣告提升,之後測試如下程式碼
function f(){
return 1
}
var f=2;
console.log(f);//2
console.log(f)位置不同會輸出不同,到底是誰覆蓋誰呢,還是別的什麼原因?
求大神講解
第一段
相當於=>
第二段
相當於=>
參見
https://www.zhihu.com/questio...
不在區塊中定義函數時, 先提升函數,再提升變數宣告. 參考 ECMAScript 5, section 10.5.
範例如下:
以上輸出為 function. 並不是 undefined.所以先提升函數,再提升變數宣告.
JS 解釋器會先提升var
聲明,注意是提升 var 聲明語句而不是賦值語句。然後,才會提升函數宣告。因此,才會形成樓上說的情況對於第二個情況,感覺和 hoisting 沒啥關係。雖然同樣提升了var f
,但這裡關鍵在於執行賦值f = 2
之後才輸出的啊。 。所以,用來證明 JS 是一個弱型別語言倒是不錯的選擇= =可能我說的有歧義,LZ 還是去看別人的解釋吧
按ecma的標準,是先提升函數聲明的;不過說真的,不管先提升的是誰,結果其實是一樣的你知道嗎
第一段程式碼是變數提升,var f=undefined,變數f指向了function;第二段程式碼依照JavaScript的執行順序,把2賦值給了f。
js在執行時,會從上往下執行。
這段程式碼中,函數宣告function f和變數宣告var f 一起提升,但是函數宣告優先權會比較高,
所以程式碼變成了
f=2(屬於賦值,位置不變只是變數宣告提升了)
第二段程式碼
你同樣用如上方法理解
被js引擎理解為
函數f被變數f覆蓋,所以輸出2
如ycloud所說 以上原因是「函數定義提升只提升到了if 的塊作用域內」
如果函數定義提升只提升到了if的區塊作用域內,那麼以上又是什麼原因呢? (chrome58測試) 為何外部又能存取if的區塊作用域內的函數