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