今天偶尔翻看了一本书《JavaScript编程精解》,在函数这一章节中难免会看到“作用域”这个字眼,之前对于作用域的概念本就不是很敏感,也就匆匆略过了,反过来看时,才明白这是一个比较重要的点。下面借作用域这一概念深入了解一下本文的重点——var与let的区别。
通常我们变量分为全局变量和局部变量,为了避免变量名的覆盖和滥用,我们尽量使用局部变量,当使用时创建,不使用时释放。如何正确去声明变量,也成了一个比较重要的话题,var与let关键字都是用来声明变量的,那么如何去选择呢?
1.var是函数作用域,let是块级作用域
var a = 1;
{
var a = 2;
//...
}
//...
对于一些开发者来说,希望使用大括号为任意代码块创建一个局部环境,但在JavaScript中,只有函数能够创建新的作用域。在上述代码中,代码块中的变量a其实引用的是代码块外部的那个同名变量,实际上,虽然JavaScript用于使用大括号创建代码块,但其作用仅限于在if语句或循环语句中组织代码体而已。在ES6中引出let关键字,就是为了解决这一问题。
var是函数作用域,let是块级作用域。比如在for循环内,用var声明变量,在for循环外也可以访问到,但let不同,若使用let在for循环内声明变量,那么在外部是访问不到的。如下:
//使用var声明变量
for (var i = 0; i < 10; i++) { }
console.log("i的值=" + i)
//使用let声明变量
for (let j = 0; i < 10; i++) { }
console.log("j的值=" + j)
2.var存在变量提升,let不存在变量提升
变量提升这一概念在使用关键字var声明变量时是存在的,var可以先使用再声明,在变量没有被声明的时候,其值为undefined;但在使用let关键字声明变量时,必须先声明再使用,否则会报错。如下:
//var的使用
console.log("还未被定义的a=" + a)
var a = 1;
console.log("已被定义的a=" + a)
//let的使用
console.log("还未被定义的b=" + b)
let b = 1;
console.log("已被定义的b=" + b)
3.var变量可以重复声明,let变量不可以重复声明
在多人进行开发中,不同的人可能会使用相同的变量名,在这时,由于每个人声明的变量名都有不同的用法,所以就会出现问题。使用var会进行变量名的覆盖,显然这并不是我们想看到的;而使用let不会出现这一问题。如下:
//var
var a = 1;
var a = 2;
console.log(a)
//let
let b = 1;
let b = 2;
console.log(b) //报错