在函数内部使用var关键字声明变量.为什么它在幕后没有定义



我是个新手,我想确保我正确理解var的吊装。

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

当";x〃;函数被调用时,我得到的答案是";未定义";;因此,引擎看到在";x〃;存在一个变量"0";a";并将其分配给"0";未定义";;

如果我们去掉变量"0";a";功能内部:

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

然后我们得到了答案";2〃;,因为发动机看起来是否存在一个变量"0";a";在函数"内部"中;x〃;,由于它在这里找不到它,它在外部/父级/全局范围中查找变量";a";,并找到它。

我做得对吗?

是的,你做得很对。只是一个小提示,当你说:

因此,引擎在";x〃;存在一个变量"0";a";并将其分配给"0";未定义";;

它更像是:只挂起声明,而不是初始化。并且已声明但未初始化的变量默认为undefined。看见https://www.w3schools.com/js/js_hoisting.asp#midcontentadcontainer.

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

您试图在初始化之前访问函数x((的本地内存。提升发生在函数本地内存内,x将被初始化为未定义。

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

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编写的。

最新更新