为什么这个是暂时性死区呢?

function foo (x = y, y = 2) {
    return [x, y]
}
foo() // 报错

这里变量y没有声明, 但是应该是变量未声明报错啊, 怎么会是暂时性死区的原因呢?未声明报错和暂时性死区的明确区别就是,暂时性死区使用了let或const命令, 并且是在块级作用域中,这样理解对吗?

暂时性死区

ES6 明确规定, 如果块级作用域中存在let和const命令, 则这个区块中对这些命令声明的变量从一开始就形成封闭作用域,
let命令声明变量之前, 该变量都是不可用的, 这在语法上称为暂时性死区

看到了一个一样的问题https://segmentfault.com/q/10...
但是babel转换过后的js代码也没有使用let呀

阅读 4.5k
2 个回答

意思就是函数参数也是使用let声明的,你没有传参,函数使用了参数的默认值,将y赋值给x,但是y还没定义,所以不能使用,所以出现暂时性死区。

let x=y;
let y=2;

上面也不全对哈,只能当作暂时性死区理解,具体可以看ES6入门函数默认参数那一部分

看MDN文档,MDN文档对此进行了规定:

“事先定义的参数(左侧)可用于以后的默认参数”

Parameters defined beforehand (to the left) are available to later default parameters

关于let提升,其实let也有提升,使用es6的参数初始化,参数的声明都提升了,会提升的块级作用域顶部,但是提升了却没有初始化,但是var变量提升会初始化为undefined,所以还可以使用,但是let没有初始化,所以在【提前的声明】到【声明初始化】的地方就是暂时性死去,也就是不能在这区间使用这个提升的但没有初始化let变量,

  1. 你说的babel转译当然是转成es5啊,不会有let的,所以babel转化运行的话,应该会提示是有声明提前,x就是undefined

  2. 而不转译只是运行的话,那么就是es6了,所以就是函数的作用域,参数会是作用域,就和let差不多了。

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

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