我是一个新手,我想确保我理解的提升与变量正确。
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”,并找到它.
我说得对吗?
3条答案
按热度按时间n3schb8v1#
是的,你说得很对。只是当你说:
因此,引擎看到在"x"的函数作用域中有一个变量"a",并将其赋值为"undefined";
更像是:只提升声明,不提升初始化。已声明但未初始化的变量默认为
undefined
。请参见www.example.com。https://www.w3schools.com/js/js_hoisting.asp#midcontentadcontainer.对于第二个函数,是的,这是正确的-首先它在函数的作用域中查找,然后,由于找不到它,它在父作用域中查找,然后是父作用域的父作用域,依此类推。
dced5bon2#
您试图在函数x()的本地内存内部初始化之前访问。提升发生在函数本地内存内部,x将使用undefined初始化。
cgyqldqp3#
简而言之,当您这样做时:
Javascript在解释你的代码之前“提升”你的变量声明,基本上把你的代码转换成这样:
当JS解析一个变量时,它会沿着函数作用域向上爬,直到找到一个与你想要的变量匹配的变量。它本质上覆盖了你的外部“a”变量。回到过去,声明你所有的变量“向上”是一个很好的做法,以防止任何奇怪的意外问题上升。
const
和let
不存在提升问题--这就是为什么今天大多数代码都是用它们而不是var
编写的。