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