es6(ECMAscript 6)之let和var以及const

es6更新了很多新的功能

let和var都是用来定义变量的,但他们的功能不同

例如在一个代码块中用了let和var定义两个不同的变量,然后在外部访问这个变量。

{
    let a = 3
    var b = 4
    console.log(a,111)
}
console.log(b)
console.log(a)

打印的结果如下:

 在代码块中都能访问到两个变量,但是在代码块外部只能访问到var定义的变量,代码块外访问let定义的变量直接报错。

由此看来let定义局部变量,var定义全局变量

在for循环中的let和var有很大的不同

var a = [];
for (var i = 0; i < 5; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

ivar声明的,全局范围都有效。每一次循环中i的值都会覆盖前一个i的值,最后输出的是循环结束的i的值。

var a = [];
for (let i = 0; i < 5; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

 ilet声明的,每一个循环的i只在本轮循环有效,每一次循环是一个块作用域那么i其实都是一个新的变量,所以输出的是6。

 

注意:

用了var定义for循环后,循环结束后i不会立即被清除掉而是会泄露到全局,而用let则不会。在循环结束后面打印i会是最后一个循环的i值。

for (var i = 0;i < 10;i++) {
    for (var j = 0;j < 10;j++) {

    }
}
console.log(i,j)

当然了在闭包状态下也是访问不到闭包中的i值的如:

(function f() {
    for (var i = 0;i < 10;i++) {
        for (var j = 0;j < 10;j++) {

        }
    }
})()
console.log(i,j)

除了这两个定义的方法外还有一个const

const在被定义之后就不能被改变否则会报错,并且它的作用域范围的定义和let是一样的

你可能感兴趣的:(es6,js)