这是怎么回事?如果我在内部函数中console.log
后声明一个变量,我会得到不同的结果
我知道var有一个功能范围,内部函数可以从他们的父级访问变量
function outer() {
var a = 2;
function inner() {
a++;
console.log(a) //log NaN
var a = 8
}
inner()
}
outer()
function outer() {
var a = 2;
function inner() {
a++;
console.log(a) //log 3
var b = 8
}
inner()
}
outer()
日志在第一个示例中返回NaN
,在第二个示例中返回日志3
由于吊装
内部函数中的a
声明被提升到函数的顶部,覆盖外部函数的a
,因此a
undefined
undefined++
返回NaN
,因此您的结果。
您的代码等效于:
function outer() {
var a=2;
function inner() {
var a;
a++;
console.log(a); //log NaN
a = 8;
}
inner();
}
outer();
以这种方式重写代码可以轻松查看正在发生的事情。
因为var
是通过函数提升的,所以你实际上是在运行undefined++
这是NaN
。如果在 inner
中删除var a = 8
,则代码按预期工作:
function outer() {
var a = 2;
function inner() {
a++;
console.log(a);
}
inner();
}
outer();
Javascript具有称为提升的机制。借助这种机制,javascript 将自动获取所有变量定义并将其保留在函数的顶部(无论是外部函数还是内部函数(。因此,在您的情况下,它将仅采用变量定义并将其提升到顶部。吊装后你的代码会是这样的
function outer() {
var a = 2;
function inner() {
var a;
a++;
console.log(a) //log NaN
a = 8
}
inner()
}
outer()
您正在尝试递增未定义的变量。这就是您收到 NaN 错误的原因。因此,如果您在声明(提升(后初始化变量,那么您将得到结果。
它们无法访问内部函数值,因此我们必须全局定义。全局之后,您可以在代码中的任何位置使用 A 值
var a=0;
function outer(){
a=2;
function inner(){
a=a+1;
console.log(a)
a = 8
}
inner()
}
outer()