【问题标题】:Scope of variables (Hoisting) in JavascriptJavascript中的变量范围(提升)
【发布时间】:2014-02-06 17:10:54
【问题描述】:

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

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 DemoJSBIN Demo2 可以玩。

PS:如果我们从test() 中删除function global() {},那么它运行正常。有人可以帮我理解为什么会这样吗?

【问题讨论】:

  • 我没有在编辑中添加答案,因为@SLaks 的答案仍然适用。 var foo = 11 IS 11 在该函数的本地范围内。 foo = 10 被忽略,function foo() 仍在创建局部范围变量 foo 以及 var foo
  • bar() 返回函数
  • @DavidBarker 是的,我现在明白了。感谢您对 Slak 的回答的精彩补充。
  • 注意,函数中的global变量其实是本地的……
  • 您也可以通过 Chrome 开发工具逐步完成该过程

标签: javascript global-variables scope


【解决方案1】:

var 语句和函数声明语句被“提升”到其封闭范围的顶部。
因此,函数中的 function global(){} 会创建一个本地的 global 名称。

在您的函数中分配给global 会绑定到这个本地名称。以下是如何使用提升“重写”它以了解编译器如何看待它:

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

【讨论】:

  • @ΘεόφιλοςΜουρατίδης:不;这就是吊装的意思。
  • 不,不应该。以 OP 编写的方式分配的功能将始终如答案所述被提升。
  • @^ 这就是我的想法。
  • @ΘεόφιλοςΜουρατίδηςadequatelygood.com/JavaScript-Scoping-and-Hoisting.html
  • @ΘεόφιλοςΜουρατίδης 几年前这篇文章让我大开眼界,我只是想分享一下;)
【解决方案2】:

我会回答你问题的第二部分,

如果我们假设函数与 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 永远不会改变。

【讨论】:

  • 非常感谢您的解释。 +1 我现在明白了。 wared 的文章对我很有帮助。我不知道 JS 世界中存在提升之类的东西 +1
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2015-09-17
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多