javascript 在函数内部使用var关键字声明变量,为什么在幕后未定义变量

t1qtbnec  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(156)

我是一个新手,我想确保我理解的提升与变量正确。

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

当调用“x”函数时,我得到的答案是“未定义”;因此,引擎看到在“x”的函数作用域中有一个变量“a”,并将其赋值为“undefined”;
如果我们去掉函数中的变量“a”:

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

然后我们得到答案“2”,因为引擎会查找函数“x”中是否有变量“a”,由于在这里找不到,它会在外部/父/全局作用域中查找变量“a”,并找到它.
我说得对吗?

n3schb8v

n3schb8v1#

是的,你说得很对。只是当你说:
因此,引擎看到在"x"的函数作用域中有一个变量"a",并将其赋值为"undefined";
更像是:只提升声明,不提升初始化。已声明但未初始化的变量默认为undefined。请参见www.example.com。https://www.w3schools.com/js/js_hoisting.asp#midcontentadcontainer.
对于第二个函数,是的,这是正确的-首先它在函数的作用域中查找,然后,由于找不到它,它在父作用域中查找,然后是父作用域的父作用域,依此类推。

dced5bon

dced5bon2#

您试图在函数x()的本地内存内部初始化之前访问。提升发生在函数本地内存内部,x将使用undefined初始化。

cgyqldqp

cgyqldqp3#

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

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”变量。回到过去,声明你所有的变量“向上”是一个很好的做法,以防止任何奇怪的意外问题上升。constlet不存在提升问题--这就是为什么今天大多数代码都是用它们而不是var编写的。

相关问题