深入浅出:探索JavaScript中var、let与const的迷思

54 阅读2分钟

😊😊😂🤣❤️😍

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之后出现了letconst可以完美的替代var并且解决了var的变量提升,for循环的情况

1.letconst块级作用域

JavaScript引擎在后台会为每一个迭代循环声明一个新的迭代变量,所以每个setTimeout引用的都是不同的变量实例(摘自红宝书P28

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

在循环体外部不可以访问到i

2.letconst暂时性死区

因为letconst不会进行变量声明提升,所以在未定义变量之前不可以使用否则会报错,所以我们应做到先定义后使用。

var age = 25;
var country = "USA";
console.log(nam); //ReferenceError: Cannot access 'nam' before initialization
let nam = "John";

3.letconst不会挂载到全局

var age = 25;
console.log(window.age); // 25
let name = "John";
console.log(window.name); // undefined

const特性

  1. 声明必须初始化
  2. 不可以改变变量的引用(当变量值为对象时可以改变属性的值

声明风格最佳实践

  • 不使用var - 有了letconst,大多数开发者发现自己不再需要var了。限制自己只使用letconst有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值(摘自红宝书P29
  • 首选cosnt,次之let
    • 使用const保存可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用const来声明变量,只在提前知道未来会有修改时使用let.