let与var

在js中声明一个变量除了一个var 还有一个let的声明。对于var 在前面的作用域中已经讲过,这次主要说下二者的区别:

在MDN上有这样的一个demo:

var list = document.getElementById("list");for (var i = 1; i <= 5; i++) { var item = document.createElement("LI"); item.appendChild(document.createTextNode("Item " + i)); let j = i; item.onclick = function (ev) { console.log("Item " + j + " is clicked."); }; list.appendChild(item);}

上面这段代码的意图是创建5个li,点击不同的li能够打印出当前li的序号。如果不用let,而改用var的话,将总是打印出 Item 5 is Clicked,因为 j 是函数级变量,5个内部函数都指向了同一个 j ,而 j 最后一次赋值是5。

对于上面的结果如果不使用let的话,也是有办法破的。方法就是用一个闭包把j的作用域给包起来。修改如下:

上面的是采用的闭包的方式在绑定的时候已经把j的值已经传递给对应的click事件了,所以能够实现相同的结果。如此很是精妙!但是对于程序的易性来说是一个不小的考验。

下面开始说说let为什么能够实现如此的结果:

let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。再看几个官方的demo.

在程序或者函数的顶层,let 的表现就象 var 一样:

function varTest() { var x = 31; if (true) { var x = 71; // same variable! console.log(x); // 71 } console.log(x); // 71}function letTest() { let x = 31; if (true) { let x = 71; // different variable console.log(x); // 71 } console.log(x); // 31}

上面的结果说明了let只在{}内使用。说到这里对开篇的那个问题就容易解释了。

用了let后,j 变成块级域(也就是花括号中的块,每进入一次花括号就生成了一个块级域),所以 5 个内部函数指向了不同的 j 。如果两个定义都在最外层则效果是一样,如下:

var x = 'global';let y = 'global';console.log(this.x);console.log(this.y);

然而,在变量声明之前引用这个变量会导致一个 ReferenceError的结果, 因为let变量 在"暂存死区" (从块的开始到声明这段).

function do_something() { console.log(foo); // ReferenceError let foo = 2;}

在 switch 申明中你可能会遇到这样的错误,因为一个switch只有一个作用块.

switch (x) { case 0: let foo; break;  case 1: let foo; // TypeError for redeclaration. break;}

循环体中是可以引用在for申明时用let定义的变量,尽管let不是出现在大括号之间.

var i=0;for ( let i=i ; i < 10 ; i++ ) { console.log(i);}

let块提供了一种在块的范围内获取变量的值,而不会影响块外面名字相同的变量的值的方法。

var x = 5;var y = 0;let (x = x+10, y = 12) { console.log(x+y); // 27}console.log(x + y); // 5

总结一下,对于let来说在某些地方确实有其长处的地方,同样也弥补了的js中块作用域的空白。

点击右上角关注作者,有趣的人在等有趣的你

js map的get 和list比 那个快_js中let和var相关推荐

  1. js的tree数组对象扁平化思否_js 中的tree型数组如何去重与合并?

    假设数据是这样的,不难发现,其中父级roleCode有重复的,子级roleCode也有重复的,如何做到把重复的去掉,同时,又可以把不重复的合并到一起呢? testTreeData: [ { roleC ...

  2. js.map error

    1. 问题:  1.1 通过bower install 的components 许多在运行的时候报404无法找到js.map文件, 如图: 2. 分析: 2.1 查看jQuery源码 /dist/jq ...

  3. js map 排序_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...

    前言 最近和女友,咳咳...(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方 ...

  4. 小手一敲,让JS Map现原形

    一.前言 文章主要讲JS Map对象的用法和如何手写Map,非常适合初步学习了JS的同学,适当的学会手写JS源码的技能,对JS理解和面试都有很大的帮助.大多数人都知道Map方法的使用,但是在网上对Ma ...

  5. Cannot find SourceMap 'XXX.js.map'问题解决

    错误代码 WARNING in ./node_modules/cesium/Source/ThirdParty/protobuf-minimal.js (Emitted value instead o ...

  6. GET /static/css/bootstrap.min.js.map HTTP/1.1“ 404GET /static/css/bootstrap.min.css.map HTTP/1.1“404

    目录 1.看大伙的办法大部分偶数让我进行以下操作 2.我的最后的解决办法 2.1 bootstrap.min.js.map 2.2 bootstrap.min.css.map 最后: GET /sta ...

  7. 关于vue页面如何反编译打包之后的.js.map 的文件

    我就是个大冤种,没有做好版本控制的代码真的让人心痛死了!!!!! 如何用vue反编译打包之后的代码,首先我们先全局下载reverse-sourcemap (注:reverse-sourcemap是从s ...

  8. 通过.js.map文件反编译 获取前端源码

    通过 source map 还原源代码 npm 上有一些从 sourcemaps 反编译成 JavaScript 和 CSS 源码的库,如 reverse-sourcemap. 执行步骤 第一步:全局 ...

  9. 解决DevTools failed to load SourceMap Could not load content for .js.map HTTP error code 404 问题

    问题 DevTools failed to load SourceMap: Could not load content for ***.js.map: HTTP error: status code ...

最新文章

  1. Spring揭秘--寻找遗失的web.xml
  2. 靠二进制画几何[图论]
  3. Caffe学习系列(5):其它常用层及参数
  4. Spring MVC中的二三事
  5. PHP API接口签名验证
  6. react学习(61)--js contact
  7. python wx模块下choice列表框值怎么更新_wx python
  8. java中各种常见的异常
  9. C语言实现2048游戏
  10. 使用Windows Server 2003搭建ASP网站001
  11. oracle 12952错误,故障码P1295
  12. python中grid的用法_Python Grid使用和布局
  13. 垃圾分类数据集-8w张图片245个类附赠tensorflow代码
  14. geem2登陆器修改服务器列表,Gee引擎怎么更换登陆器皮肤 GeeM2传奇编辑自定义皮肤的方法讲解...
  15. Crazy bubbles
  16. Apache Calcite论文概要
  17. 我的职业生涯中所获取的职业技能证书
  18. 达人评测 i7 1260p和i7 1255u选哪个
  19. Peak prominences(峰日珥)
  20. SIM800C 透传模式与非透传模式测试对比

热门文章

  1. 创建mysql用户并在单个数据库上赋权
  2. mysql导入社工库文件_社工库-数据表结构设计和数据导入
  3. 3从控制台输入三个数,并输出最大值
  4. Android开发笔记(一)像素的单位
  5. 小学计算机知识点,小学信息技术单元知识点目录介绍
  6. 教师排课程序设计c语言,计算中心
  7. python calendar.isleap_Python calendar isleap()用法及代碼示例
  8. php二叉树层序遍历 带层数和不带层数 需要用到队列
  9. centos7下Jenkins管理员admin密码忘记后处理方法
  10. 一次mongoengine查询速度慢的优化