Javascript 嵌套函数是否影响全局变量(在同一函数中声明)?
在上面的代码中,Javascript 嵌套函数是否影响全局变量(在同一函数中声明)?,javascript,hoisting,Javascript,Hoisting,在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7。但当按如下方式添加嵌套函数b时,我对输出结果感到困惑: var b = 4; function f() { b = 7; return b; } a = f(); console.log(a); //output: 7 console.log(b); //output: 7 在我看来,由于函数b在函数f中起作用,首先在激活对象上创建对函数b的引用,当解释器到达b=7时,我们已经看到属性名b存在,因此代码b=7不做任何
b=7
使b自动全局化,从而将var b
的值更改为7。但当按如下方式添加嵌套函数b时,我对输出结果感到困惑:
var b = 4;
function f() {
b = 7;
return b;
}
a = f();
console.log(a); //output: 7
console.log(b); //output: 7
在我看来,由于函数b在函数f中起作用,首先在激活对象上创建对函数b的引用,当解释器到达
b=7
时,我们已经看到属性名b存在,因此代码b=7
不做任何事情并继续,因此console.log(b)
输出4
。但是为什么console.log(a)
仍然输出7
b=7
在这里什么都不做,对吗 对于第一段代码,此断言不准确:
在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7
在语句b=7
中,b绑定到外部var b
声明,因此b=7
在闭包中分配给该b
变量
在第二段代码中,您对提升的作用有误解。将提升视为简单地将声明移动到其范围的顶部,因此:
var b = 4;
function f() {
b = 7;
return b;
function b() {}
}
a = f();
console.log(a); //output: 7
console.log(b); //output: 4
…表现得好像您这样做了:
function f() {
b = 7;
return b;
function b() {}
}
在
b=7
行上,您正在为局部变量b
分配一个新值7
。因此返回b代码>返回7。对于第一个代码块,此断言不准确:
在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7
在语句b=7
中,b绑定到外部var b
声明,因此b=7
在闭包中分配给该b
变量
在第二段代码中,您对提升的作用有误解。将提升视为简单地将声明移动到其范围的顶部,因此:
var b = 4;
function f() {
b = 7;
return b;
function b() {}
}
a = f();
console.log(a); //output: 7
console.log(b); //output: 4
…表现得好像您这样做了:
function f() {
b = 7;
return b;
function b() {}
}
在b=7
行上,您正在为局部变量b
分配一个新值7
。因此返回b
返回7。“我们已经看到属性名b存在,因此codeb=7
不执行任何操作并继续”-否。它执行一些操作,即分配给函数声明的现有局部变量b
。在return
语句中,然后返回该局部变量。如果b=7
赋值没有执行任何操作,f()
将返回函数。顺便说一句,您应该真正忘记“激活对象”术语。作用域是一条记录,它有一个变量b
的条目,而不是一个“属性名”。“我们已经看到属性名b存在,因此代码b=7
不执行任何操作并继续执行”-否。它执行一些操作,即分配给函数声明的现有局部变量b
。在return
语句中,然后返回该局部变量。如果b=7
赋值没有执行任何操作,f()
将返回函数。顺便说一句,您应该真正忘记“激活对象”术语。作用域是一条记录,它有一个变量b
的条目,而不是一个“属性名”。