本文共 1440 字,大约阅读时间需要 4 分钟。
和var
关键字用法基本一致。
let a = 10; let fn = function () { console.log('hello') } fn(); console.log(a);
var
的区别var
关键字会将变量挂载到window
对象上,无块级作用域,有变量提升。let
关键字不会将变量挂载到window
对象上,有独立的块级作用域,无变量提升。let
具有暂时性死区的特性。举例说明:
for (var i = 0; i < 5; i++) { console.log(i); } alert(i);//5
不会报错。
for (let i = 0; i < 5; i++) { console.log(i); } alert(i);//i is not defined
报错了。循环变量i
在结束循环后,理应被立即销毁,但是使用var
关键字声明的i
却会一直存在,不符合我们的期望。推荐使用let
定义循环变量。
if (true) { var num = 10; } console.log(num);//10
用var
定义在if
语句中的局部变量,在外部也能访问到,这在大部分情况下不是我们期望的。推荐使用let
定义局部变量。
再看一下这段代码:
var arr = []; for (var i = 0; i < 3; i++) { arr[i] = function () { console.log(i); } } arr[0]();//3 arr[1]();//3 arr[2]();//3
这段代码中,每次循环都会给数组返回一个函数,这个函数会输出i
。但是,它们不会如我们所愿,输出对应的索引值,它们都会输出循环结束后的i
的值,即为3。
因为,数组中的3个函数中用到的i
变量均为一个,那就是这个循环变量i
的引用,循环并没有为它们3个单独创建3个i
变量。
var arr = []; for (let i = 0; i < 3; i++) { arr[i] = function () { console.log(i); } } arr[0]();//0 arr[1]();//1 arr[2]();//2
但是如果使let
循环变量,结果则截然不同。这三个函数会如愿输出索引值。
因为let
关键字有独立的块级作用域,循环会为三个函数分别创建三个i
的副本。
var num = 3; if (true) { console.log(num);//报错,未定义 let num = 20; }
在局部作用域中,如果使用let
定义变量,那么这个变量不会受同名全局变量的影响。也就是说,上面代码中,执行到console.log(num)
时,会先找if
局部作用域的num
,找不到的情况下会查找全局作用域,但是这个局部作用域用let
定义了一个num
,则在找不到num
时,不会查找全局作用域,故报错。
let
的出现,使得JS语言变得更加严谨,安全,合理。
转载地址:http://ohozi.baihongyu.com/