😊😊😂🤣❤️😍
在ES6之前我们都是使用 var定义变量,其特性如下:
1. 变量声明提升
当使用var定义变量时,变量的定义会被提升到当前作用域的顶端
var age = 25;
var country = "USA";
console.log(nam); // undefined
var nam = "John";
提升后
var age = 25;
var country = "USA";
var nam // 自动赋值为undefined
console.log(nam); // undefined
nam = "John";
2.for循环中的var使用
使用var 定义在for循环之外可以访问到,因为var是函数作用域
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 500);
}
// 5 5 5 5 5
ES6之后出现了let和const可以完美的替代var并且解决了var的变量提升,for循环的情况
1.let和const块级作用域
JavaScript引擎在后台会为每一个迭代循环声明一个新的迭代变量,所以每个setTimeout引用的都是不同的变量实例(摘自红宝书P28)
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 500);
}
// 0 1 2 3 4
在循环体外部不可以访问到i值
2.let和const暂时性死区
因为let和const不会进行变量声明提升,所以在未定义变量之前不可以使用否则会报错,所以我们应做到先定义后使用。
var age = 25;
var country = "USA";
console.log(nam); //ReferenceError: Cannot access 'nam' before initialization
let nam = "John";
3.let和const不会挂载到全局
var age = 25;
console.log(window.age); // 25
let name = "John";
console.log(window.name); // undefined
const特性
- 声明必须初始化
- 不可以改变变量的引用(
当变量值为对象时可以改变属性的值)
声明风格最佳实践
- 不使用
var- 有了let和const,大多数开发者发现自己不再需要var了。限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值(摘自红宝书P29) - 首选
cosnt,次之let- 使用
const保存可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用const来声明变量,只在提前知道未来会有修改时使用let.
- 使用