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

新手上路,请多包涵
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(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 进行申明,就报错了

阅读 3.6k
3 个回答

var 存在变量提升

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

var a

var a ={
  function(){
    let a = 1
  }
}
var b ={
  function(){
    let a = 1
  }
}

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

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