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