一個經典的js中關於塊級作用域和聲明提升的問題


function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}
console.log(function functions(true));

請問這段代碼會輸出什么呢。

答案將永遠是:b。

解釋一下為什么,因為在js是沒有塊級作用域的,又因為函數聲明提升的原因,上面的這段代碼變相當於:

function functions(flag) {
    function getValue(){return 'a'};
    function getValue(){return 'b'};
    if (flag) {
      ....
    } else {
      ....
    }

    return getValue();
}

因此無論flag為何值,返回的方法始終為重寫后的方法。

那么怎么才能解決這個問題呢...

function functions(flag) {
    if (flag) {
      var getValue = function () { return 'a'; }
    } else {
      var getValue = function () { return 'b'; }
    }
    return getValue();
}

不再用函數聲明,而是用函數表達式的方法,因為函數表達式不會提升,因此只有當邏輯只想到這兒的時候才會執行。所以就解決問題啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM