在看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这是为什么呢
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
参数变量是默认声明的,所以不能用let或const再次声明。
你把问题搞复杂了,本质上和上面存在的问题是一样的
我认为是参数也是声明。
然后函数内部又
let x,导致报错。参数的默认值相当于
let x; let y = x有一个不允许重复声明的规则,即:
参考文档 阮一峰es6文档let部分
这段代码在运行时,
f()中的参数x和y,根据执行环境上下文,读取到的是let x = 1,即参数x = 1, y = 1,那么在f()这个函数的作用域内,就会出现两个变量x的声明,而在es6中let不允许在相同作用域内,重复声明同一个变量,所以才会出现声明重复的错误。