一个经典的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();
}

再也不用函数声明,而是用函数表达式的方法,由于函数表达式不会提高,所以只有当逻辑只想到这儿的时候才会执行。因此就解决问题啦。作用域

相关文章
相关标签/搜索