Es6 let 命令用来声明变量基本用法 let a = 10 console.log(a) //10 // 代码块内执行 { let b = 5 console.log(b) // 5 }for循环内也是比较试用 for (let i =0;i<3;i++) { console.log(i) // 0,1,2 }Es6 let命令只在所在的代码块内使用(块级作用域) 例1 使用let在函数代码块内使用,Es5中是没有块级作用域的,Es6中的let实际上是为Javascript新增了块级作用域,其实在声明a为10的代码块中则为一个块级作用域,if代码块中也是块级作用域,这就表明了现在有两个块级作用域,重点来了外层代码块不受内层代码块影响,所以a在不同的地方打印出的结果不同 function f() { let a = 10 if (1===1) { let a = 5 console.log(a) // 5 } console.log(a) // 10 } f() 例2 这个循环的例子let声明了之后,在循环{}代码块内都属于i的块级作用域内,所以在里面怎么打印都会有结果,而在循环外部打印i的结果则是未定义 for (let i =0;i<3;i++) { console.log(i) // 0,1,2 } console.log(i) // 这样会报错 i is not defined然而var则不一样,var也是声明变量,它则在全局范围内有效,让我们来看看 例1 现在看看var定义了变量,在内部可以打印出小于三的每个结果,在代码块外层同样可以得到结果,但是结果和代码块内的不一样,这是因为外层的i是拿到了循环完成之后的结果 for (var i =0;i<3;i++) { console.log(i) // 0,1,2 } console.log(i) // 3 为什么会得到3,是因为for循环从0开始执行,i++,1然后是2,只执行2次 例2 这里使用var得到的结果全是5,我们来分析一下它的执行步骤,我们都知道js是从上到下执行,首先执行的函数,声明变量a为10,if代码块,然后再次声明a为5,打印5,执行出代码块再次打印a时,此时a的值已经被改变5 function f() { var a = 10 if (1===1) { // 在一个代码块的中变量并不会覆盖掉代码块外面的变量 var a = 5 console.log(a) // 5 } console.log(a) // 5 } f()Es6 let 不存在变量提升和暂时性死区 例1 测试let不存在变量提升 { console.log(foo) // 报错ReferenceError let foo = 1 }如果存在变量提升的话上面的代码执行应该是 { let a console.log(a) //undefined a=2 }例2 如果使用let这样操作执行到if会报错,因为let不存在变量提升 function func() { if (typeof let == ‘undefined’) { } let val = ’’ }我们来看看var的变量提升是什么样的,与let区别在哪里 例1 var的变量提升(值不提升) { console.log(foo) // undefined var foo = 1 }例2 var变量提升(先判断后声明),这样就不会报错 function func() { if (typeof val == ‘undefined’) { } var val = ’’ }let 存在的暂时性死区社么为let的死区,只要是在let声明之前则为死区let 声明在同层代码块内,不可以重复声明 例1 在一个函数内声明相同的变量名,使用let,这样会报错,如果使用var就会报错 func() function func() { let a = 1 let a = 2 console.log(a, ‘xx’) }例2 现在我们来看看var的执行结果,var 是可以重复声明的 func() function func() { var a = 1 var a = 2 console.log(a, ‘xx’) // 2 }