JavaScript中的变量范围(提升)



我的一个朋友正在在线测验,他问我这个问题,我无法回答。

var global = false;
function test() {
  global = true;
  return false;
  function global() {}
}
console.log(global); // says false (As expected)
test();
console.log(global); // says false (Unexpected: should be true)

如果我们假设函数与var变量一起悬挂在顶部,那么让我们尝试一下。

var foo = 1;
function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = 11;
}
bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??

这是JSBIN演示和JSBIN DEMO2。

ps:如果我们从test()中删除function global() {},则运行良好。有人可以帮我了解为什么会发生这种情况吗?

var语句和函数声明语句被"吊起"到其封闭范围的顶部。
因此,您功能中的function global(){}创建了本地global名称。

在功能中分配给global与此本地名称绑定。这是您可以使用吊装来"重写"它的方式来了解编译器的看法:

function test() {
    var global = function() {};   // hoisted; 'global' now local
    global = true;
    return false;
}

我会回答您问题的第二部分

如果我们假设函数与var变量一起悬挂在顶部

bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??

您应该尝试使用console.log(bar()); console.log(foo);。但是,提升对您的功能的作用是:

function bar() {
    var foo;
    function foo() {}
    return foo;
    foo = 10;
    foo = 11;
}

因此,您应该期望返回功能,因为您的变量分配是在return语句之后。var和函数声明都使foo成为本地变量,因此全局foo = 1永远不会更改。

相关内容

  • 没有找到相关文章

最新更新