let和const

let

1.let 类似于var ,用于声明变量,但是和var不同的是let声明的变量只能在let命令所在的代码块内有效,例:     

{let a=10;
 var b=11;
}
a//ReferenceError:a is not defined
b//1

上述代码显示let声明的变量在代码块外无法访问

 

2.for循环中let和var有截然不同的表现:

 1 for(var i=0;i<3;i++){
 2   
 3 };
 4 console.log(i)//3
 5 
 6 
 7 for(let i=0;i<3;i++){
 8   
 9 };
10 console.log(i)//ReferenceError:i is not defined

var 声明的变量是全局变量,在循环外依然可以访问到,let声明的变量只能在循环内访问到,以前的for循环就会带来一些问题例如:

var a = [];
for (var i = 0; i < 3; i++) {
    a[i] = function () {
        console.log(i);

    }
}
a[0]() //3
a[1]() //3
a[2]() //3

var声明的变量是全局变量,a的每一项引用的都是全局中的i,并不是确切的值,当循环结束后i变成了3,所以a的每一项输出的都是3

解决这个问题最简便的方法是将var 变成let:

var a = [];
for (let i = 0; i < 3; i++) {
    a[i] = function () {
        console.log(i);

    }
}
a[0]() //0
a[1]() //1
a[2]() //2

let声明的变量只在块级作用域里有效,相当于每次循环的i都是新变量,只保存所在循环的值,置于为什么每轮循环的i是按顺序赋值的,是因为js引擎会记住上次循环的值,初始化本轮循环时就已经进行了计算

还有for循环设置变量的那一部分是一个父作用域,循环内部是一个单独的子作用域

for(let i=0;i<3;i++){
    let i="abc";
    console.log(i);
    
}
//abc
//abc
//abc

 

  

posted @ 2018-07-31 16:42  山楂与灰机  阅读(120)  评论(0)    收藏  举报