javascript - es6中作用域的问题
伊谢尔伦
伊谢尔伦 2017-04-11 12:17:13
[JavaScript讨论组]

在看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这是为什么呢

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
PHPz

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

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

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

天蓬老师

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

PHP中文网

参数的默认值相当于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不允许在相同作用域内,重复声明同一个变量,所以才会出现声明重复的错误。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号