javascript - 函數宣告和變數宣告優先權
学习ing
学习ing 2017-06-12 09:28:15
0
7
931
  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)位置不同會輸出不同,到底是誰覆蓋誰呢,還是別的什麼原因?
求大神講解

学习ing
学习ing

全部回覆(7)
黄舟

第一段

 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...

某草草

不在區塊中定義函數時, 先提升函數,再提升變數宣告. 參考 ECMAScript 5, section 10.5.

範例如下:

function f(){}
var f;
console.log(f);

var g;
function g(){}
console.log(g);

以上輸出為 function. 並不是 undefined.所以先提升函數,再提升變數宣告.

洪涛

JS 解釋器會先提升 var 聲明,注意是提升 var 聲明語句而不是賦值語句
然後,才會提升函數宣告。因此,才會形成樓上說的情況

對於第二個情況,感覺和 hoisting 沒啥關係。雖然同樣提升了 var f,但這裡關鍵在於執行賦值 f = 2 之後才輸出的啊。 。所以,用來證明 JS 是一個弱型別語言倒是不錯的選擇= =

可能我說的有歧義,LZ 還是去看別人的解釋吧

黄舟

按ecma的標準,是先提升函數聲明的;不過說真的,不管先提升的是誰,結果其實是一樣的你知道嗎

为情所困

第一段程式碼是變數提升,var f=undefined,變數f指向了function;第二段程式碼依照JavaScript的執行順序,把2賦值給了f。

漂亮男人

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

黄舟
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的區塊作用域內的函數

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板