let const var

参考《ES6标准入门》---阮一峰

let和var区别1:var存在变量提升、let不会

var:

var a = 20;
var f = function F(){
    console.log(a);//undefined
    var a = 10;
    console.log(a);//10
};
f();

相当于:

var a = 20;
var f = function F(){
    var a;
    console.log(a);//undefined
    a = 10;
    console.log(a);//10
};
f();

let和var区别2:

作用域不同:var为全局作用域,let为块级作用域

function  Fun1(){
    // 不可见
    for(let i = 1; i<5; i++){
        //可见
    }
    //不可见
}
function Fun2(){
    //可见
    for(var i = 1;i<5; i++){
        //可见
    }
    //可见
}

let和var区别3:

var f = function F(){
    let n = 5;
    if(true){
        let n = 10;
    }
    console.log(n);//5
}

f();

块级作用域外层代码块不受内层代码块的影响。

var f = function F(){
    var n = 5;
    if(true){
        var n = 10;
    }
    console.log(n);//10
}

f();

let和var区别4:

for (var i = 0; i < 4; i++) {
    setTimeout(function(){
        console.log(i);
    },1000);
}
//4 4 4 4

解决方案1:

因为函数 function() 属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,可以通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用 i 这个变量了:

for (let i = 0; i < 4; i++) {
    setTimeout(function(){
        console.log(i);
    },1000);
}
//0 1 2 3

解决方案2:

通过传入参数,间接的把变量传入到 function中。

for (var i = 0; i < 4; i++) {
    (function(i){
        setTimeout(function(){
            console.log(i);
        },1000);
    })(i);
}
//0 1 2 3

const:

1:变量值不能修改

2:必须初始化

3:块级作用域(和let相同)

4:无变量提升

5:对于符合类型变量,变量名不指向数据,const只能保证变量名指向的地址不变,并不能保证地址指向的数据不变。

猜你喜欢

转载自blog.csdn.net/wjiafengw/article/details/83149573