栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深入理解ES6中的let修饰符

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入理解ES6中的let修饰符

ES6中的let说明

新的声明方式:let

1. 不属于顶层对象window

代码:结果: 2.不允许重复声明

代码:结果: 3.不存在变量提升

代码:结果: 4.暂时性死区

代码:结果: 5.块级作用域

说明:代码:结果: 6.拓展

问题提出:

新的声明方式:let

不属于顶层对象window不允许重复声明不存在变量提升暂时性死区块级作用域 1. 不属于顶层对象window 代码:

;

console.log("用于测试let修饰符");
//var ->variable
//创建一个变量
var a = 5;
console.log(a);
//发现这行也会输出?为啥呢,不是说它是变量吗
//在js设计,将顶层属性和全局变量进行了挂钩,这是一个问题(污染全局变量),js设计的败笔
console.log(window.a);

//相当于为一个属性赋值
p = 6;
console.log(p);
console.log(window.p);

//delete()用于删除对象的属性
delete p;
// console.log(p);

//测试let修饰符
let b = 90;
console.log(b);
//下面输出undefined
console.log(window.b);
结果:

2.不允许重复声明 代码:
//不允许重复声明变量
var c = 1;
var c = 2;
console.log(c);

let d = 1;
let d = 2;
console.log(d);
结果:

报错信息:Uncaught SyntaxError: Identifier 'd' has already been declared

3.不存在变量提升 代码:
//不存在变量提升
console.log(e);
var e = 0;

//Uncaught ReferenceError: Cannot access 'f' before initialization
console.log(f);
let f = 0;
结果:

4.暂时性死区 代码:
//暂时性死区
//Uncaught ReferenceError: Cannot access 'g' before initialization
//说明:let形成了一个封闭的作用域,let必须在下且赋初始值才可使用,防止变量在声明之前就使用
// var g = 1;
// if (true) {
//     g >>= g;
//     let g;
// }

(function deadArea(a = b, b = 1) {
    console.log(a, b);
})();
结果:


5.块级作用域 说明:

在ES6之前(let/const),js的变量作用域只有两个:

    全局作用域(var声明),与前面的顶层对象window联想在一起函数级作用域(在函数中声明)
代码:
//块级作用域:
for (var i = 0; i < 3; i++) {
    console.log(i);
}
console.log(i);
//块级作用域:
for (let j = 0; j < 3; j++) {
    console.log(j);
}
console.log(j);
if (true) {
    let aa = 1;
}
//词法声明不能出现在单语句上下文中,ES6规定
//Uncaught SyntaxError: Lexical declaration cannot appear in a single-statement context
if (true) let ab = 1;
结果:


6.拓展 问题提出:

以下代码输出结果?

for (var i = 0; i < 3; i++) {
    setTimeout(function (){
        console.log(i);
    });
}

结果:

解释说明:

说明:setTimeout()执行是异步操作,并不会马上执行,js有一个事件循环机制‘event loops‘,有线程空闲且时间到的时候才执行for循环是一个同步操作(结合java去思考),当console.log执行时,for循环已经执行完成,so你懂得换而言之:for循环三次,每次都会有一个异步的setTimeout(),每个异步操作取值时都是在for循环执行完毕都进行的,so。。。重点:异步操作要等到同步操作执行完毕才可取值(关键词:读写一致、线程安全)

修改:

//使用闭包修改至正常逻辑

for (var j = 0; j < 3; j++) {
    (function (k) {
        setTimeout(function () {
            console.log(k);
        });
    })(j);
}

//使用let修改
//在编译时会进行处理
for (let l = 0; l < 3; l++) {
    setTimeout(function () {
        console.log(l);
    });
}

let编译处理结果(本文使用的babel编译器):

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710802.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号