var b = 4;
function f() {
b = 7;
return b;
}
a = f();
console.log(a); //output: 7
console.log(b); //output: 7
在上面的代码中,b = 7
使b自动成为全局变量,从而将var 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
我认为,由于功能b悬挂在功能f中,因此首先在激活对象上创建了对功能b的引用,当我们将解释器获取到b = 7
时,我们已经看到了属性名称b存在,因此代码b = 7
不执行任何操作并继续进行,因此console.log(b)
输出4
。但是console.log(a)
为何仍输出7
? b = 7
在这里什么也不做,对吧?
答案 0 :(得分:4)
对于第一段代码,此声明不正确:
在上面的代码中,b = 7使b自动全局,从而将var b的值更改为7。
在语句b = 7
中,b绑定到外部var b
声明,因此b = 7
将分配给闭包中的b
变量
在第二段代码中,您对起重的工作有误解。认为吊装只是将声明移到其作用域的顶部,所以:
function f() {
b = 7;
return b;
function b() {}
}
...的行为就像您这样做:
function f() {
let b = function () { }
b = 7;
return b;
}
在行b = 7
上,您正在将新值7
分配给局部变量b
。因此return b;
返回7。