javascript中var,let,const的区别用法
anlondon Lv6

来源:javascript中var,let,const的区别用法 - 简书

  1. var
    var相比let就是管的比较宽,他的值可以被内部修改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function tests(){
var n = 1;
if (true) {
var n = 2;
}
console.log(n); //值被函数内部修改,输出2
}
tests();


if(1){
var a = 100;
}
console.log( a );//输出100,因为var没有块级作用域,这里a会成为全局变量
  1. let
    let是es6中新增定义,带有块级作用域,只会在所定义块生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function test(){
let n = 1;
if (true) {
let n = 2;
}
console.log(n); //值不会被修改,输出1
}
test();


if(1){
let b = 100;
}
console.log( b );//错误 ReferenceError: b is not defined
//因为let的块级作用域,所以b变量只存在与if内部
  1. const
    const用来定义常量(可以是字符串,数组,函数,对象等),并且初始值不可为空,但他并不是不可更改的。举个栗子:

    1
    2
    3
    4
    5
    6
    7
    8
    const c;//会产生报错.
    const d = 1;//正确

    const arr = [1, 2];
    arr.push(1);//正确 [1, 2, 1]
    arr[0] = 3;//正确 [3, 2, 1]

    arr = [];//错误TypeError: invalid assignment to const `arr'

    可见,如果有需要,可以改变const里所存储的值,但它的指向空间是无法操作的。

  2. 有趣的面试例子
    面试的时候很经常遇到一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    for (var i = 0; i < 5; i++) {
    setTimeout(function() {
    console.log(i);
    }, 1000);
    }
    //这个例子执行完输出什么结果?

    //答案是 5,5,5,5,5

    //如果想要输出0,1,2,3,4改怎么实现?
    //其中一种方案就是把var换成let就可以了。let的块级作用域在这里就体现出来了。

    for (let i = 0; i < 5; i++) {
    setTimeout(function() {
    console.log(i);
    }, 1000);
    }
 Comments