【发布时间】:2019-10-01 23:36:21
【问题描述】:
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 应该在这里什么都不做,对吧?
【问题讨论】:
-
"我们已经看到属性名称 b 存在,所以代码
b = 7什么都不做,继续进行" - 不。它做了一些事情,即分配给函数声明的现有局部变量b。在return语句中,然后返回该局部变量。如果b = 7赋值没有做任何事情,f()将返回函数。 -
顺便说一句,您真的应该忘记那个“激活对象”术语。范围是一个记录,并且有一个变量
b的条目,而不是“属性名称”。
标签: javascript hoisting