在函数内使用 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”变量。在过去,将所有变量声明为“最上层”是一种很好的做法,以防止提升任何奇怪的意外问题。 const
和 let
不存在提升问题 - 这就是为什么今天的大多数代码都是用这些而不是 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。
对于第二个函数,是的,这是正确的——首先它在函数的作用域内查找,然后,由于找不到它,它在父作用域内查找,然后在父作用域内查找,然后是父作用域的父作用域,依此类推。
我是新手,我想确保我正确理解了 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”变量。在过去,将所有变量声明为“最上层”是一种很好的做法,以防止提升任何奇怪的意外问题。 const
和 let
不存在提升问题 - 这就是为什么今天的大多数代码都是用这些而不是 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。
对于第二个函数,是的,这是正确的——首先它在函数的作用域内查找,然后,由于找不到它,它在父作用域内查找,然后在父作用域内查找,然后是父作用域的父作用域,依此类推。