参考《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只能保证变量名指向的地址不变,并不能保证地址指向的数据不变。