es6 块级作用域

es6 块级作用域let

在下面代码中为什么不加上let a = 2000 这句话,console.log(a) 结果是 100;而加上这句后为什么会报错a为定义。
我是在学习es6中let的知识点是遇到的。

var a = 100, b = 10;
function fun(){
    if(true){
        console.log(a);
        let a = 2000;
    }
}
fun();// 请把代码文本粘贴到下方(请勿用图片代替代码)

如果是if里面是var a =200;那么console.log(a)的结果是undefined,为什么换成let后 程序在这里报错了?

阅读 2.9k
6 个回答

var用法存在变量提升,就是在用到变量的时候,会在作用域内找这个变量。所以在console.log(a)的时候,在全局找var a,提升之后,相当于var a ; console.log(a);
let和const都不会变量提升,就是在console.log(a)的时候,let a在后面,相当于a还未定义,所以是undefined
https://segmentfault.com/a/11...
之前看到的,ES6的用法,你可以瞅一眼。

因为你用var会有个变量提升 var hoisting,所以不会报错。
源代码

function fun() {
  if (true) {
    console.log(a);
    var a = 2000;
  }
}

变量提升后等于是这样

function fun() {
  var a;
  if (true) {
    console.log(a);
    a = 2000;
  }
}

而用let就没有这个概念,你引用了未定义变量当然就报错了。

没有 let 输出 外面全局变量 var a = 100

有 let 会出现暂时性死区, 直到 let a = 2000; a 都未定义

改 let 为 var, 存在变量提升, 相当于如下代码

if (true) {
    var a;
    console.log(a);
    a = 2000
}

let在包含声明的作用域顶部被创建,通常这种被叫做“变量提升”。但和var不同的是,var的创建会设置一个初试的undefined值,let变量在没有运行到声明代码时是不会被初始化的。引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反,该变量的值是 undefined )。直到初始化执行的时候,该变量都处于从块开始到初始化处理的“暂存死区”。

function do_something() {
  console.log(bar); // undefined
  console.log(foo); // ReferenceError: foo is not defined
  var bar = 1;
  let foo = 2;
}

参见:https://developer.mozilla.org...

新手上路,请多包涵

1.全局变量,没有访问限制
2.局部变量,if内部为块级作用域,所以变量声明前无法访问,否则报错
3.内部使用var声明变量,首先明确一点,js在执行前会有一个变量提取过程,这个过程被称为预解析

解析过程中变量a的变化:
代码解析    赋值:a —> undefined 
代码执行    赋值:a -> 100 
fun函数解析 赋值:a -> undefined (由于内部使用var声明,会覆盖掉外部声明)
fun函数执行 -> console.log(a) -> undefined
              赋值:a -> 2000 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏