在函数内使用 var 关键字声明变量。为什么它是未定义的,在幕后

Declaring a variable using the var keyword inside a function. Why is it undefined, behind the scenes

我是新手,我想确保我正确理解了 var 的提升。

var a = 2;
var x = function() {
   console.log(a);
   var a = 1;
};
x();

调用“x”函数时,我得到的答案是“undefined”; 所以,引擎看到在“x”的函数作用域中有一个变量“a”并将其赋值给“undefined”;

如果我们取出函数内部的变量“a”:

var a = 2;
var x = function() {
   console.log(a);
}
x();

然后我们得到答案“2”,因为引擎查找函数“x”中是否有变量“a”,因为它在这里没有找到它,所以它在outer/parent/global 变量“a”的作用域,并找到它。

我做对了吗?

简而言之,当您这样做时:

var a = 2;
function() {
   console.log(a);
   var a = 1;
}

Javascript 在解释您的代码之前“提升”您的变量声明,基本上将您的代码转换为:

var a = 2;
function() {
   // there a now new "a" variable which is undefined
   var a; 
   console.log(a);
   a = 1;
}

当 JS 解析变量时,它会向上爬取函数范围,直到找到与您想要的变量匹配的变量。当提升内部“a”变量时,它实际上会覆盖外部“a”变量。在过去,将所有变量声明为“最上层”是一种很好的做法,以防止提升任何奇怪的意外问题。 constlet 不存在提升问题 - 这就是为什么今天的大多数代码都是用这些而不是 var.

编写的

是的,你说得很对。当您说:

时,请注意

So, the engine sees that in the function scope of "x" there is a variable "a" and assigns it to "undefined";

更像是:只提升声明,不提升初始化。并声明但 non-initialized 变量默认为 undefined。参见 https://www.w3schools.com/js/js_hoisting.asp#midcontentadcontainer

对于第二个函数,是的,这是正确的——首先它在函数的作用域内查找,然后,由于找不到它,它在父作用域内查找,然后在父作用域内查找,然后是父作用域的父作用域,依此类推。