最近在看 ES6 函数形参默认值语法的时候发现一段代码:
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 报错
上面代码中,调用bar函数之所以报错,是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。如果y的默认值是x,就不会报错,因为此时x已经声明了。
我当时特别不能理解, 我觉得这段函数应该解析成下面这样:
function bar() {
var x; // 变量声明的提升
var y;
x = y;
y = 2;
return [x, y];
}
但是很显然如果这样解析就不会报错,后来我在网上搜了一下,有人解释说是用 let
声明的.
虽然用let
声明确实会报同样的错,但是我不服啊,这怎么就能看出来是用let
声明的了? 难道 ES6 默认这个语法就是用 let
来声明的?
后来请教了一个大牛,给指了个方向,说让我看看变量对象
和活动对象
.
相关概念
1. 执行环境( 执行上下文 )的生命周期
1.1 创建阶段
- 生成变量对象 ( Variable object, VO )
- 建立作用域链 ( Scope c