【问题标题】:Why is my JavaScript hoisted local variable returning undefined but the hoisted global variable is returning blank? [duplicate]为什么我的 JavaScript 提升的局部变量返回未定义但提升的全局变量返回空白? [复制]
【发布时间】:2015-02-27 02:10:39
【问题描述】:

作为学习 JavaScript 的一部分,我尝试编写代码来展示我正在学习的概念;今天我正在学习提升变量。这是我写的代码:

console.log("A: My name is " + name);   

function happy() {
  console.log ("1: I am " + feeling);   
    var feeling = "happy";
  console.log ("2: I am " + feeling);   
}
happy(); 

var name = "Jim";
console.log("B: My name is " + name);   

我期望得到以下结果:

A: My name is undefined
1: I am undefined
2: I am happy
B: My name is Jim

但是,在 WriteCodeOnline.com 和另一个沙箱中测试我的代码时,第一个 console.log 显示 A: My name is。我使用的是 Chrome 浏览器,如果有影响的话。

那么,我的问题是,为什么函数中被提升的局部变量返回未定义,而被提升的全局变量返回空白?

【问题讨论】:

  • 看来确实存在另一个问题来回答我的问题。如果我知道我的问题的答案,我可能也能找到另一个问题。如果这个问题被关闭,我没有问题。

标签: javascript undefined hoisting


【解决方案1】:

这里发生的是您正在访问window.name

这是window 上的预定义属性,因此您提升的var name 实际上并没有创建新变量。全局范围内已经有一个具有该名称的名称,默认情况下,它具有一个空白字符串值。

要观察您所期望的行为,您可以使用 name 以外的变量名,或将代码放入函数中:

function hoisting() {
  console.log("A: My name is " + name);   

  function happy() {
    console.log ("1: I am " + feeling);   
    var feeling = "happy";
    console.log ("2: I am " + feeling);   
  }
  happy(); 

  var name = "Jim";
  console.log("B: My name is " + name);   
}

hoisting();

【讨论】:

  • 嗯,很高兴知道我的期望是正确的。现在回到学习关键字等不能用作变量名。
  • @JimLockwood 这里重要的一点是将您的标识符保持在全局范围之外。 :)
  • @RobG 你不是说"name" in window吗?
  • @RobG console.log(typeof name); console.log("name" in window); 打印出 string true。标准创建者不倾向于将标准window 属性的创建留给用户。
  • @JLRishe——也许这就是为什么它是一个空字符串,直到用户将其设置为其他值。
猜你喜欢
  • 2015-01-01
  • 1970-01-01
  • 2018-06-10
  • 2016-05-13
  • 2013-01-23
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多