var x = 1; function foo(x = x) { // ... } foo() // ReferenceError: x is not defined
上面代码中,参数x = x形成一个单独作用域。实际执行的是let x = x,由于暂时性死区的原因,这行代码会报错”x 未定义“。
以上是阮一峰老师的教程内容 http://es6.ruanyifeng.com/#do...
想请教一个问题,如果是let声明的话,那么为什么如果在函数体内用var重复声明变量x没有报错呢?
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
如果是这个原因,那么为什么用let重复声明就会报错呢,毕竟是不同的作用域
-------------------分隔线-------------------
呃,非常感谢大家的回答,我理解什么是let的暂时性死区。。我不明白的是,为什么说函数参数是let声明的
该解释的都解释差不多了,我只回答这个问题
这里的
x=x
跟let
声明没有任何关系。let x
或者var x
是一个变量声明。x=y
是一个赋值表达式,包含=
操作符,左识别符号x
,右识别符y
function foo(x=x){}
中的x=x
是一个函数声明
里的参数
里的赋值模式
。最后,不要试图用
js
去解释语法。想知道更多自己在线解析成ast
就知道了。astexplorer