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(); }
不再用函数声明,而是用函数表达式的方法,因为函数表达式不会提升,因此只有当逻辑只想到这儿的时候才会执行。所以就解决问题啦。