博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
let关键字
阅读量:3960 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
bat备份数据库
查看>>
linux数据库导出结果集且比对 && grep -v ---无法过滤的问题
查看>>
shell函数与自带变量
查看>>
linux下shell获取不到PID
查看>>
sort详解
查看>>
linux,shell中if else if的写法,if elif
查看>>
shell中单引号、双引号、反引号的区别
查看>>
shell脚本死循环方法
查看>>
shell中$*和$@的区别
查看>>
log4cxx 的编译安装过程和使用
查看>>
简单邮件系统程序
查看>>
STL里的multimap使用详解
查看>>
STL 库其中的 std::string用法总结
查看>>
模态对话框的销毁过程与非模态对话的几种销毁方法
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>