js中暂时性死区的疑问

看ES6中let的使用时,提到了暂时性死区的概念,如下

ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

但是下文提到

function bar(x = y, y = 2) {
  return [x, y];
}

bar(); // 报错

这里并没有使用let或者const,为什么也会因为死区而报错呢?

原文链接:http://es6.ruanyifeng.com/#do...

阅读 5.4k
3 个回答

编译后是这样的,因为是严格模式,所有变量必须先声明

"use strict";

function bar() {
  var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : y;
  var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;

  return [x, y];
}

文中不就说了原因了吗。

上面代码中,调用bar函数之所以报错(某些实现可能不报错),是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。如果y的默认值是x,就不会报错,因为此时x已经声明了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题