共计 1566 个字符,预计需要花费 4 分钟才能阅读完成。
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
}