搜尋

首頁  >  問答  >  主體

javascript - 函數宣告和變數宣告優先權

  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学习ing2762 天前892

全部回覆(7)我來回復

  • 黄舟

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

    回覆
    0
  • 某草草

    某草草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.所以先提升函數,再提升變數宣告.

    回覆
    0
  • PHP中文网

    PHP中文网2017-06-12 09:30:15

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

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

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

    回覆
    0
  • 黄舟

    黄舟2017-06-12 09:30:15

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

    回覆
    0
  • 为情所困

    为情所困2017-06-12 09:30:15

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

    回覆
    0
  • 漂亮男人

    漂亮男人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

    回覆
    0
  • 黄舟

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

    回覆
    0
  • 取消回覆