为什么我的JavaScript提升的局部变量返回未定义,而提升的全局变量返回空白?

为什么我的JavaScript提升的局部变量返回未定义,而提升的全局变量返回空白?,javascript,undefined,hoisting,Javascript,Undefined,Hoisting,作为我学习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 na

作为我学习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:我的名字没有定义
1:我没有定义
他说:我很高兴
我叫吉姆
但是,当在WriteCodeOnline.com和另一个沙箱中测试我的代码时,第一个console.log显示
A:my name is
。我使用的是Chrome浏览器,如果有区别的话


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

这里发生的事情是您正在访问

这是
窗口
上的预定义属性,因此提升的
变量名
实际上并没有创建新变量。全局范围中已经有一个同名的,默认情况下,它有一个空字符串值

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

功能提升(){
console.log(“A:我的名字是”+name);
函数happy(){
console.log(“1:我是”+感觉);
var feeling=“happy”;
console.log(“2:我是”+感觉);
}
快乐的();
var name=“Jim”;
console.log(“B:我的名字是”+name);
}

起重()“name”吗?@RobG
console.log(type of name);console.log(窗口中的“名称”)打印出
字符串true
。标准创建者不倾向于将标准
窗口
属性的创建留给用户。@JLRishe也许这就是为什么在用户将其设置为其他值之前,它是一个空字符串。似乎存在另一个问题来回答我的问题。如果我知道我问题的答案,我可能也能找到另一个问题。如果这个问题结束了,我没有问题。