ES6 折腾记 - let/const 块级变量及块作用域

简介: ES5及之前是木有块级变量这个说法的,常规性是用闭包来防止变量泄露;我来列出下ES5 var声明的一些特点1. 函数内的变量若是带var声明,则会覆盖外部的全局变量优先使用;若是函数内部声明变量不带var,则直接覆盖同名的全局变量2. 函数内存在变量提升的情况,可以先使用后声明3. for循环中的var会污染全局【不局限于循环内】

前言


话说ES6之前有局部变量,全局变量,唯独木有块级变量;也没有常量之说...


块级变量let及常量const


var


ES5及之前是木有块级变量这个说法的,常规性是用闭包来防止变量泄露;


我来列出下ES5 var声明的一些特点


  1. 函数内的变量若是带var声明,则会覆盖外部的全局变量优先使用;若是函数内部声明变量不带var,则直接覆盖同名的全局变量
  2. 函数内存在变量提升的情况,可以先使用后声明
  3. for循环中的var会污染全局【不局限于循环内】


// 1.
        var test1 = 5;
        function f(){
            var test1 = 3;
            console.log(test1);
        }
        f(); //打印出的结果是3
//2.
        var test1 = 5;
        function f2(){
            console.log(test1);
            var test1 = 3;
        }
        f2(); //打印结果是undefined, JS允许不存在的变量先使用,默认会初始化为一个undefined
//3. 
        for(var i = 0 ; i < 9 ; i++){
            console.log("循环内部"+i);
        }
        console.log(i); //打印值为 9 
        console.log(i * 5); // 打印值为 45


let


而ES6中出了一个新变量,不在于取代var,而在于解决ES5中var声明中的一些痛点;这货就是let


我来说说这货的特点


  1. let是块级变量,不存在于window下[非全局属性],window.变量名是找不到这货的,它的生活空间就那么一小块
  2. let不允许重新声明同名变量,会抛出异常,具有唯一性;
  3. let不允许没声明就使用,会抛出异常,只有执行该声明的时候才能使用;
  4. let有自己特色的闭包特性,比如在for循环的应用中


//1.
   let tt = '哟哟切克闹!';
    console.log(tt); //打印出'哟哟切克闹!'
    console.log(window.tt); //打印出undefined
//2.
    function test2(){
        var abc = 99;
        let abc = 88;
        console.log(abc);
    }
    test2()//打印值:Uncaught SyntaxError: Identifier 'abc' has already been declared
//3.
    function test3(){
        console.log(test3);
        let test3 = '恭喜发财!!';
    }
    test3();//打印值:Uncaught ReferenceError: test3 is not defined
//4. 每一次for循环都重新绑定一次作用域且脱离失效,就是let自身的特色
    for(let i= 0 ; i < 9 ; i++){
        console.log("循环内的值是: "+i);
    }
    console.log(i); //打印值看下面
/*
循环内的值是: 0
test.html:10 循环内的值是: 1
test.html:10 循环内的值是: 2
test.html:10 循环内的值是: 3
test.html:10 循环内的值是: 4
test.html:10 循环内的值是: 5
test.html:10 循环内的值是: 6
test.html:10 循环内的值是: 7
test.html:10 循环内的值是: 8
test.html:12 Uncaught ReferenceError: i is not defined
*/


const


const的也有一些自身特点:


  1. let一样,具有唯一性,不可重复声明;
  2. 可以理解为只读变量,但是并非一成不变 — 值得一提哦


//1.
    var qwe = 22;
    const qwe = 11;// Uncaught SyntaxError: Identifier 'qwe' has already been declared(…)
//2.
    const N = 99; //现在状态我是只读变量么,答案是的。。更改抛出异常;
    const N1 = [1,'2'];
    const N2 = {a:'b'}; //数组和对象这状态是只读不可变的么。。。答案不是的,还能操作数组内的数据及对象数据的变动~~~~~记得么!!!!
/* 不信瞅瞅
声明:const N1 = [1,'2'];
数组操作:N1.push(6)
输出结果:[1, "2", 6]
声明:const N2 = {a:'b'};
对象操作:N2.add = [1,2,3]
输出结果:Object {a: "b", add: Array[3]}
*/


显式作用域


这货和let是好基友;为了让我们代码更加清晰,不至于越来越混乱,为了更美好的明天,我们有必要引入显式块级作用域;


  • 写法: {} — 对象!!!! , 不,这货就是显式块级作用域


var idea = "playGame";
if(idea){
    {
        let gameName = 'LOL';
        //我就是显式块级作用域
        //玩游戏肯定要专心啊,但是脱离游戏状态就要果断点额;
        //do somethins .... LOL ,Dota2..
    }
    console.log('I hope play'+gameName); //玩你妹,学习去
}


温馨提示let最好结合显式块级作用域一起用,或者在闭包中,在全局中使用【没把握好,容易一堆报错;】


总结


本来想扯扯作用域这块,,,但。。。。心有余而力不足。因为说到作用域,就不得不提闭包,说到闭包就不得不提this;那么说到this,又能扯到ES5的call,apply,bind,IIFE,try..catch这些,ES6的箭头函数。。。让我捋捋头绪再总结一下吧。知识面涉及比较广

目录
相关文章
|
数据采集 JSON 数据可视化
【python】python懂车帝数据可视化(代码+报告)
【python】python懂车帝数据可视化(代码+报告)
|
6月前
|
安全
一文看懂网络文化经营许可证
一文看懂网络文化经营许可证
403 3
|
9月前
|
传感器 物联网 数据挖掘
新技术趋势与应用:物联网与虚拟现实的未来发展###
随着科技的迅猛发展,物联网(IoT)和虚拟现实(VR)已成为引领未来的重要技术趋势。本文旨在探讨这两项新兴技术的发展趋势和应用场景,通过分析当前技术现状、挑战及未来前景,揭示物联网和虚拟现实在各领域的潜在影响和应用价值。研究表明,物联网在智能家居、智慧城市、工业自动化等方面具有广泛的应用前景;而虚拟现实则在游戏娱乐、教育培训、医疗健康等领域展现出巨大的潜力。本文认为,随着技术的不断进步,物联网和虚拟现实将深度融合,为社会经济发展带来新的机遇和挑战。 ###
459 59
|
9月前
|
机器学习/深度学习 API 数据库
淘宝拍立淘按图搜索商品API接口详解
拍立淘按图搜索商品API接口提供了一种通过上传商品图片来搜索相似或相同商品的功能。用户只需上传一张商品图片,系统通过图像识别技术对该图片进行分析和处理,提取出商品的特征信息,并在商品数据库中进行匹配搜索,最终返回与上传图片相似或相同的商品列表。这一功能广泛应用于电商平台、购物应用以及图像搜索等领域,极大地提升了用户的购物体验。
|
12月前
|
存储 消息中间件 缓存
中间件redis的使用
【9月更文挑战第28天】Redis 是一个开源的、基于内存的数据结构存储系统,可用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,使其在各种应用场景中表现出色。Redis 作为缓存中间件能显著提高数据访问速度,其缓存过期策略有助于管理数据生命周期。在 .NET 应用程序中使用 Redis 缓存,可通过安装 `StackExchange.Redis` 库并连接到 Redis 服务器来实现数据的读写操作。此外,Redis 作为消息中间件,基于生产者-消费者模型实现消息队列,确保消息的可靠性和顺序性。
352 4
|
12月前
|
存储 安全 C++
C++ 11新特性之unique_ptr
C++ 11新特性之unique_ptr
274 4
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
人工智能 自动驾驶 安全
AI与未来生活:技术如何重塑我们的世界
在这篇文章中,我们将深入探讨人工智能(AI)如何改变我们的生活方式。从智能家居到自动驾驶汽车,从虚拟助手到医疗诊断,AI正在逐步渗透到我们生活的方方面面。我们将看到AI如何提高我们的生活效率,改善我们的生活质量,甚至帮助我们解决一些看似无法解决的问题。然而,我们也将讨论AI带来的挑战和道德问题,以及我们需要如何应对这些问题。最后,我们将展望AI在未来可能的发展趋势,以及它可能带来的更深远的影响。
|
Windows
XMind 常用快捷键(思维导图总结)
XMind 常用快捷键(思维导图总结)
453 0
|
机器学习/深度学习 Ubuntu Linux
操作系统实验一到实验九合集(哈工大李治军)(三)
操作系统实验一到实验九合集(哈工大李治军)(三)
713 0
操作系统实验一到实验九合集(哈工大李治军)(三)