zhq*_*vvn 2 javascript hoisting
var b = 4;
function f() {
b = 7;
return b;
}
a = f();
console.log(a); //output: 7
console.log(b); //output: 7
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,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
Run Code Online (Sandbox Code Playgroud)
在我看来,由于函数 b 在函数 f 中提升,因此首先在激活对象上创建对函数 b 的引用,当我们得到解释器 gets 时,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闭包中的该变量。
在第二个代码块中,您对提升的作用存在误解。将提升视为简单地将声明移动到其范围的顶部,因此:
function f() {
b = 7;
return b;
function b() {}
}
Run Code Online (Sandbox Code Playgroud)
...行为就好像您这样做了:
function f() {
let b = function () { }
b = 7;
return b;
}
Run Code Online (Sandbox Code Playgroud)
在线上b = 7,您正在为局部变量分配一个新值。因此返回 7。7breturn b;
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |