以下代码不是很理解

新手上路,请多包涵
function fn() {
  var a = 10;
  console.log(b)
  var b = 20
}
fn()

为什么以上代码输入undefined,把var b 换成let b就报错

阅读 2.5k
6 个回答

用var声明变量的时候,会有变量声明提升的效果,也就是实际上变量b在函数内顶部已经被声明,但此时还没有被赋值,所以是undefined;
用let声明变量的时候,不具有变量声明提升的效果,所以报错了。

js 中 var 会使变量提升,也就是会跑到最前面,如果是在函数里面,就跑到函数最前面(示例 a 旁边),就相当于比示例 console.log 先了定义,所以能输出。而换成 let 则不会提升,在哪个位置定义就在哪个位置,所以会输出未定义

var会在他的作用域内进行变量提升,而let不会。你的代码其实可以这样写:

function fn() {
    var a;
    var b;
    a = 10;
    console.log(b);
    b = 20;
}

var b 时会发生变量提升 所以输出undefined
let b 的时候不存在变量提升,所以声明前调用变量,都会报错,这就涉及到一个概念——暂时性死区。

变量生命提示了解一下

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