es6的const和let

news/2024/7/11 0:39:22 标签: es6

其实也是由于面试官喜欢提到这两者的区别,了解基本的比如:let和const不存在变量提升,存在暂时性死区(TDZ),不允许重复声明,但面试官可能更想听到,你深入说下怎么变量提升,为什么变量提升就不好了,以并能提及对应的应用场景就更好了。

为此,下面主要内容会讲到块级作用域绑定,let和const与var的联系和区别。
过去,javascript 的变量声明机制一直让人感到困惑,因为大多数c语言在声明变量时也会创建变量绑定,但js中,可能使用变量之后你再声明变量也能打印value。

  1. var声明及变量提升机制(Hoisting)
    在函数作用域或全局作用域中如果通过var声明变量,会当成当前作用域顶部声明的变量,此为变量提升。譬如以下,在预编译阶段,js引擎将函数中的var value提升到函数顶部,出现下面情况。但换成let不会出现下面情况,也就是说let不存在变量提升,const同是。
function getV(){
if(condition){
var value="blue"
console.log(value);
}else{
console.log(value);//此处仍可以访问value,underfined
}
  1. let代替var声明变量可以将作用域限制在当前代码块中,通常在一个块级作用域内(函数内部、块内{})只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
  2. let和const不允许重复声明 , 而const声明实际是不允许修改值的绑定,但允许修改值。
  3. 开发者最希望实现for循环的块级作用域,因为可以将随意声明的计数器变量限制在循环内部。根据前面变量提升,一个for循环,如果用var定义计数器变量,由于变量提升,当循环结束后,计数器变量i仍然可在外面访问,而let声明的变量则可达到我们限制在块级作用域内的效果。
  4. let和const在循环中,for-in、for-of每次迭代时创建新的绑定,从而使循环体中创建的函数可访问到相应迭代的值,而非最后一次迭代的值。
    也就是下面的结果,执行了for循环后,通过func.push可得到一个数组,每项均是一个函数,期望输出i为0-9,但实际上由于var的变量提升,for循环后得到的结果为最后一次i=10,连续十次输出,这肯定不是我们想要的。
       var func = [];
        for (var i = 0; i < 10; i++) {
            func.push(function() {
                console.log(i);
            })
        }

        func.forEach(function(func) {
            func();
        })

在这里插入图片描述
解决方法:
立即执行函数

        var func = [];
        for (var i = 0; i < 10; i++) {
            func.push(function(value) {
                return function() {
                    console.log(value);
                }
            }(i))
        }
        func.forEach(function(func) {
            func();
        })

在这里插入图片描述
有了let就简单了,因为每次循环时let都会创建一个新的变量i,将其初始化为i的当前值,所以循环内部创建的每个函数都得到属于它自己的i值

        var func = [];
        for (let i = 0; i < 10; i++) {
            func.push(function() {
                console.log(i);
            })
        }

        func.forEach(function(func) {
            func();
        })
        console.log(func);

http://www.niftyadmin.cn/n/1263283.html

相关文章

silverlight 2 Random 随机数解决方案

usingSystem;usingSystem.Security.Cryptography;publicclassRNG { privatestaticRNGCryptoServiceProvider rngp newRNGCryptoServiceProvider(); privatestaticbyte[] rb newbyte[4]; ///<summary>///产生一个非负数的乱数 ///<…

创建对象的方法,理解各个方法的好处和缺点,为什么要改进

1. new Object或字面量 虽然Object构造函数或字面量都可以创建单个对象&#xff0c;可是其明显的缺点在于&#xff0c;使用同一个接口创建很多个对象&#xff0c;会产生很多重复性代码。 obj {name: liujie,age: 12}2. 工厂模式 为解决上面问题&#xff0c;考虑采取工厂模式…

学习自定义moss菜单

最近觉得可以自定义moss菜单很有意思&#xff0c;上网一看&#xff0c;相关文档还真是不少。有谈论“网站操作”部分添加的&#xff0c;有“文档库”操作下面添加的&#xff0c;还有对于相关文档的。我呢&#xff0c;在这里引用一下前辈们的成果&#xff0c;也做了一下自定义mo…

静态资源有关问题

网站中会引入哪些常见的静态资源&#xff1f; JS .js .jsx .coffee .tsCSS .css .less .sass .scssImages .jpg .png .gif .bmp .svg字体文件 .svg .ttf模板文件 .vue .jade 网页中引入的静态资源多了会引起什么问题 网页加载速度慢&#xff0c;因为我们会发起很多二次请求 要…

IANA

IANA (Internet Assigned Numbers Authority) &#xff0c;Internet号分配机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。国际互联网代理成员管理局&#xff08;IANA&#xff09;是在国际互联网中使用的IP 地址、域名和许多其它参数的管理机构。IP地址、自治系统…

diff算法笔记

搭建测试环境snabbdom: snabbdom 是著名的虚拟 DOM 库&#xff0c;是 diff 算法的鼻祖&#xff0c;Vue 源码就是借鉴了 snabbdom 创建一个全英文路径下的空文档&#xff0c;在vscode的命令行先初始化文档:npm init搭建webpack 和 webpack-dev-server 开发环境&#xff0c;必须…

毛毛虫---人生哲理

第一只毛毛虫话说第一只毛毛虫&#xff0c;有一天爬呀爬呀过山河&#xff0c;终于来到这棵苹果树下。他并不知道这是一棵苹果树&#xff0c;也不知树上长满了红红的苹果。当他看到同伴们往上爬时&#xff0c;不知所以的就跟着往上爬。没有目的&#xff0c;不知终点&#xff0c;…

Adobe 为教育业免费提供Flex Builder 3 Pro正式版

欢迎访问http://www.westsource.cn Adobe 为教育业免费提供Flex Builder 3 Pro正式版。 只要你是学生&#xff0c;填写相关真实资料以及上传你的学生证照片&#xff0c;激活码会在两周内寄到你邮箱。 地址是 http://www.flexregistration.com/转载于:https://www.cnblogs.com/w…