【问题标题】:JavaScript Variable HoistingJavaScript 变量提升
【发布时间】:2013-11-27 00:14:17
【问题描述】:

我无法理解为什么 name 在这里获得值

(function() {
  (function() {
    var name = 'Fido';
  })();
})();

console.log(name + ' says woof'); //Output: Fido says woof

变量名不应该是内部函数的局部变量吗?

【问题讨论】:

  • 变量是内部函数的局部变量。我无法重现您的结果。
  • 所以我的控制台说“Fido 说 woof”。它应该说类似“undefined says woof”

标签: javascript variables scope hoisting


【解决方案1】:

变量是局部的,你看到的值不是来自函数内部的赋值。

您还将窗口命名为“Fido”,当您在全局范围内使用name 时,您将获得window.name 属性。

如果你在 jsfiddle 中尝试,你会得到“result says woof”。

演示:http://jsfiddle.net/Guffa/eDxf3/

【讨论】:

  • 我想知道它是否以某种方式缓存它。我显然让 Fido 说 woof 而不是结果
  • 好的,我关闭了浏览器窗口并重新加载了页面,现在它只显示“说 woof”。这一定是一些缓存问题,因为我尝试了很多不同的代码变体以确保它正在做它应该做的事情。
【解决方案2】:

你错了!如果在浏览器控制台中执行此代码将输出: says woof

我认为您需要更好地了解提升。 This article 肯定会帮助你。 以下是从文章中摘录的简短描述:


在 JavaScript 中,名称以四种基本方式之一进入范围:

  • 语言定义:默认情况下,所有范围都指定名称 this 和 arguments。
  • 形参:函数可以具有命名形参,其作用域为该函数的主体。
  • 函数声明:格式为 function foo() {}。
  • 变量声明:采用 var foo; 的形式。

函数声明和变量声明总是被 JavaScript 解释器以不可见的方式移动(“提升”)到其包含范围的顶部。显然,函数参数和语言定义的名称已经存在。这意味着像这样的代码:

function foo() {
    bar();
    var x = 1;
}

实际上是这样解释的:

function foo() {
    var x;
    bar();
    x = 1;
}

事实证明,包含声明的行是否会被执行并不重要。以下两个函数是等价的:

function foo() {
    if (false) {
        var x = 1;
    }
    return;
    var y = 1;
}

function foo() {
    var x, y;
    if (false) {
        x = 1;
    }
    return;
    y = 1;
}

【讨论】:

  • 我的控制台显示“Fido 说 woof”。
  • 我没看错,但看起来 Chrome 不知何故将变量缓存在某处。我退出窗口并重新加载页面,一切正常。唷。当逻辑不起作用时,我讨厌它。感谢您帮助我尝试。
  • @planetoftheweb 确保您更好地理解提升和范围界定,下次您将有信心在哪里找到这样的问题
  • 问题是我理解提升,但我的浏览器在欺骗我。一旦我刷新,它做了我认为它应该做的事情。谢谢
  • “你错了!”- 不,OP 描述了一个实际发生的控制台输出, 然后继续说他们认为变量应该是本地的。这没有错。他们描述的预期行为反映了对范围的正确理解。
猜你喜欢
  • 2015-06-22
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2019-05-07
  • 2021-12-23
  • 2017-07-18
相关资源
最近更新 更多