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

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

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

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

答案將永遠是:b。java

解釋一下爲何,由於在js是沒有塊級做用域的,又由於函數聲明提高的緣由,上面的這段代碼變至關於:函數

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

    return getValue();
}

所以不管flag爲什麼值,返回的方法始終爲重寫後的方法。blog

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

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

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

相關文章
相關標籤/搜索