知食记
搜索文档…
连等赋值

引子

1
function foo() {
2
let a = b = 0;
3
a++;
4
return a;
5
}
6
7
foo();
8
typeof a; // => ???
9
typeof b; // => ???
Copied!

解析

这个代码的重点在第二行:let a = b = 0。这个语句声明了一个局部变量 a,但是它也声明了一个全局变量b
foo() 作用域或全局作用域中都没有声明变量 b。因此 JS 引荐将b = 0 表达式解释为 window.b = 0
如下图所示,函数 foo 中的 i 都是一个偶然创建的全局变量:
同样,在咱们的问题中,b 是一个偶然创建的全局变量。在浏览器中,上面的代码相当于如下:
1
function foo() {
2
let a;
3
window.b = 0;
4
a = window.b;
5
a++;
6
return a;
7
}
8
9
foo();
10
typeof a; // => 'undefined'
11
typeof window.b; // => 'number'
Copied!
typeof a'undefined'。变量 a 仅在 foo() 作用域中声明,在外部作用域内不可用。
typeof b 结果是 'number'b 是一个值为 0 的全局变量
复制链接