es6中作用域的问题

在看es6的时候看到作用域这块,有两段代码比较

let x=1;
function f(y=x){
    let x=2;
    console.log(y);
}
f();

结果是1
上面这段代码我知道是为什么
可是这段代码

let x=1;
function f(x,y=x){
    let x=2;
    console.log(y);
}
f();

这段代码报错Identifier 'x' has already been declared这是为什么呢

阅读 3.1k
4 个回答

参数变量是默认声明的,所以不能用let或const再次声明。

function f(x){
    let x=2
}
f();

你把问题搞复杂了,本质上和上面存在的问题是一样的

我认为是参数也是声明。
然后函数内部又let x,导致报错。

参数的默认值相当于let x; let y = x

有一个不允许重复声明的规则,即:

let不允许在相同作用域内,重复声明同一个变量。

参考文档 阮一峰es6文档let部分

let x=1;
function f(x,y=x){
    let x=2;
    console.log(y);
}
f();

这段代码在运行时,f()中的参数xy,根据执行环境上下文,读取到的是 let x = 1 ,即参数 x = 1, y = 1,那么在f()这个函数的作用域内,就会出现两个变量x的声明,而在es6中let不允许在相同作用域内,重复声明同一个变量,所以才会出现声明重复的错误。

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