函数参数的默认值--从变量对象和活动对象的角度解释

最近在看 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值