var
var声明作用域
使用var在一个函数内部定义一个变量,就意味着变量将在函数退出时被销毁。(在函数内去掉var操作符之后,变量就变成了全局变量,只要调用一次函数,就会定义这个变量并可以在函数外部访问到)
var声明提升
使用var声明的变量会自动提升到函数作用域的顶部
let(let与var最明显的区别是 let声明的范围是块作用域,var声明的是函数作用域)
暂时性死区
let声明的变量不会在作用域中被提升
全局声明
let声明在全局作用域中发生,相应变量会在页面的生命周期内存续。必须确保页面不会重复声明同一变量。(在全局作用域中声明变量,let声明的变量不会成为window对象的属性,var声明的会)
var name = 'Matt';
console.log(window.name); // Matt
let age = 26;
console.log(window.age);// undefined
条件声明
for循环中的let声明
let出现前,for循环定义的迭代变量会渗透到循环体外部:
for(var i = 0; i < 5; ++i){
//循环逻辑
}
console.log(i); // 5
使用let迭代变量的作用域仅限于for循环块内部:(虽然const变量和let变量很相似,但是不能用const来声明迭代变量,迭代变量会自增)
for(let i = 0; i < 5; ++i){
//循环逻辑
}
console.log(i); // ReferenceError : i没有定义
let每次迭代声明一个独立变量实例
const
const的行为和let基本相同,唯一的重要区别就是它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。
const声明一个不会被修改的for循环变量,每次迭代只是创建一个新变量。这对for-of和for-in循环特别有意义:
let i = 0;
for(const j = 7; i < 5; ++i){
console.log(j);
}
// 7,7,7,7,7
for( const key in {a :1 ,b :2}){
console.log(key);
}
//a,b
for(const value of [1,2,3,4,5]){
console.log(value);
}
//1,2,3,4,5
总结
const优先,let次之。
使用const声明可以让浏览器运行时强制保持变量不变,在提前知道未来变量会有修改时,再使用let。