为什么我的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);   
我预期的结果如下:

我的名字没有定义 1:我没有定义 他说:我很高兴 我叫吉姆 但是,当在WriteCodeOnline.com和另一个沙盒中测试我的代码时,第一个console.log显示:my name is。我使用的是Chrome浏览器,如果有区别的话


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

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

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

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

功能提升{ console.logA:我的名字是+name; 功能快乐{ console.log 1:我是+感觉; 感觉=快乐; console.log 2:我是+感觉; } 快乐的 var name=Jim; console.logB:我的名字是+name; }
吊起很高兴知道我的期望是正确的。现在回到学习关键字等不能用作变量名的问题上。@JimLockwood这里重要的一点是将标识符排除在全局范围之外:@RobG你不是指窗口中的名称吗?@RobG console.logtypeof name;窗口中的console.logname;打印字符串true。标准创建者不倾向于将标准窗口属性的创建留给用户。@JLRishe也许这就是为什么在用户将其设置为其他值之前,它是一个空字符串。似乎存在另一个问题来回答我的问题。如果我知道我问题的答案,我可能也能找到另一个问题。如果这个问题结束了,我没有问题。