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