js函数内部用var 与 let 申明与参数相同变量名的前者正常,后者报错

发布于 2022-09-11 17:54:11 字数 699 浏览 31 评论 0

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的
函数的扩展
var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}

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

foo() // 报错,Uncaught SyntaxError: Identifier 'x' has already been declared

为什么用在函数内部用var申明与相同的参数变量可行,且会覆盖参数中的同名变量;但是使用let 或 const 就会报错,我对使用 let 与 const 还能理解,因为参数处相当于是用 let x进行了申明,后面再用 let 进行申明,就报错了

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

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

发布评论

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

评论(3

肤浅与狂妄 2022-09-18 17:54:11

var全局声明实际上就是window.(声明的变量),而在函数里就是私有变量,是函数作用域。let会形成块级作用域,全局声明并不是挂载到window上面(let,和var的区别具体可以看看别个的博客)。你这个实际上都是在全局声明的,自然会冲突。你看看下面代码会不会报错呢

var a

var a ={
  function(){
    let a = 1
  }
}
var b ={
  function(){
    let a = 1
  }
}
顾忌 2022-09-18 17:54:11

我之前也提过这样的问题,可以看一下我的自问我自答链接描述

屌丝范 2022-09-18 17:54:11

var 存在变量提升

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文