关于es6中函数作用域的问题

发布于 2022-09-12 23:11:35 字数 809 浏览 13 评论 0

var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}

foo() // 3 x // 1

阮一峰的es6入门里有这么一段代码,相关的解释是

上面代码中,函数foo的参数形成一个单独作用域。这个作用域里面,首先声明了变量x,然后声明了变量yy的默认值是一个匿名函数。这个匿名函数内部的变量x,指向同一个作用域的第一个参数x。函数foo内部又声明了一个内部变量x,该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和外部全局变量x的值都没变。

对此我的理解是函数参数那边形成一个父作用域,函数内部形成一个子作用域,但这样理解的话

function fn(x) {
    let x = 1;
}
// Uncaught SyntaxError: Identifier 'x' has already been declare

function fn(x) {
    var x = 1;
}
// 正常

第一种会报重复声明是为什么,就算let会暂时锁区,当他们难道不是父子作用域吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笨笨の傻瓜 2022-09-19 23:11:35

函数参数算是和函数体一个作用域,而var是可以多次声明同一个变量的所以即使在函数了写了var x = 3不会报错,而let就不行,建议永不不要用var
你可以参考下这段等价的代码

function test() {
   var x = 1;
   (() => {x = 2})()
   var x = 3;
   console.log(x)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文