1.简化内部函数代码

当用到内部函数的时候,let会让你的代码更加简洁。

var list = document.getElementById('list');for (let i = 1; i <= 5; i++) {let item = document.createElement('li');item.appendChild(document.createTextNode('Item ' + i));item.onclick = function(ev) {console.log('Item ' + i + ' is clicked.');};list.appendChild(item);
}// to achieve the same effect with 'var'
// you have to create a different context
// using a closure to preserve the value
for (var i = 1; i <= 5; i++) {var item = document.createElement('li');item.appendChild(document.createTextNode('Item ' + i));(function(i){item.onclick = function(ev) {console.log('Item ' + i + ' is clicked.');};})(i);list.appendChild(item);
}

以上示例的工作原理是因为(匿名)内部函数的五个实例引用了变量i的五个不同实例。注意,==如果你将let替换为var,则它将无法正常工作,因为所有内部函数都将返回相同的i:6的最终值==。此外,我们可以通过将创建新元素的代码移动到每个循环的作用域来保持循环更清晰。

在程序或者函数的顶层,let并不会像var一样在全局对象上创造一个属性,比如:

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

2.let暂存死区的错误

在相同的函数或块作用域内重新声明同一个变量会引发SyntaxError。

if (x) {let foo;let foo; // TypeError thrown.
}

在 ECMAScript 2015 中,let绑定不受变量提升的约束,这意味着let声明不会被提升到当前执行上下文的顶部。在块中的变量初始化之前,引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反,该变量的值是 undefined )。该变量处于从块开始到初始化处理的“暂存死区”。

function do_something() {console.log(bar); // undefinedconsole.log(foo); // ReferenceError: foo is not definedvar bar = 1;let foo = 2;
}

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

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

但是,重要的是要指出嵌套在case子句内的块将创建一个新的块作用域的词法环境,这不会产生上面显示的重新声明错误。


let x = 1;switch(x) {case 0: {let foo;break;}  case 1: {let foo;break;}
}

JavaScript let的理解相关推荐

  1. 【javascript】深入理解对象

    为什么80%的码农都做不了架构师?>>>    今天学习的主题是 JavaScript对象. 要创建一个JavaScript对象大家应该都觉得很简单,直接写上一行 var obj = ...

  2. 我对javascript对象的理解

    前言 JavaScript这门语言除了基本类型都是对象,可以说JavaScript核心就是对象,因此理解JavaScript对象及其种种特性至关重要,这是内功.本文介绍了我对es5对象,原型, 原型链 ...

  3. JavaScript面向对象——深入理解寄生组合继承

    JavaScript面向对象--深入理解寄生组合继承 之前谈到过组合继承,会有初始化两次实例方法/属性的缺点,接下来我们谈谈为了避免这种缺点的寄生组合继承 寄生组合继承: 思路:组合继承中,构造函数继 ...

  4. JavaScript面向对象——深入理解原型继承

    JavaScript继承--深入理解原型继承 原型继承 // 父类function School (name, address) {this.name = namethis.address = add ...

  5. 【Javascript】深入理解this作用域问题以及new/let/var/const对this作用域的影响

    理解this作用域 <javascript高级程序设计>中有说到: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,t ...

  6. Javascript闭包简单理解

    Javascript闭包简单理解 原文:Javascript闭包简单理解 提到闭包,想必大家都早有耳闻,下面说下我的简单理解. 说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和 ...

  7. JavaScript之全面理解面向对象的JS

    今天看到一篇文章写得很好,对于像博主这种js一般级别的菜鸟很有帮助,博主秉着"好文要转"的原则收藏了这篇文章,简单排了下版,分享给大家,本文转自原文:http://www.ibm. ...

  8. javascript之异步操作理解---回调函数,async,await以及promise对象

    javascript之异步操作理解---回调函数,async,await以及promise对象 概述 概述 写在前面:虽然平时做项目,但是发现自己写的代码还是很烂.最近接触了一个对性能要求比较高的项目 ...

  9. 细心看完这篇文章,刷新对Javascript Prototype的理解

    var person={name:'ninja'}; person.prototype.sayName=function(){return this.name; } 分析上面这段代码,看看有没有问题? ...

  10. [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)

    一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个.不妨叫它主线程. 但是实际上还存在其他 ...

最新文章

  1. java文件锁定_如何使用java锁定文件(如果可能的话)
  2. 批量kill掉linux中符合某些字段的进程
  3. WPF整理-为User Control添加依赖属性
  4. DisplayPowerState
  5. 实验十:程序结构与数组 8、数组实训
  6. CodeForces - 160E Buses and People(线段树+三维偏序)
  7. hdu 1806线段树 区间合并
  8. redis的安装过程基本配置及遇到问题的解决
  9. script标签中的async和defer
  10. android 存储方式简书,Android的多种数据存储方式
  11. java servlet 入门_servlet 入门详解
  12. 基于CUDA的TTI介质逆时偏移与ADCIGs提取
  13. Exynos4412 BSP平台搭建(详细图解)
  14. 计算机视觉实战(十一)Scale Invariant Feature Transform(SIFT)(附完整代码)
  15. 【javascript】解析psd文件踩坑
  16. 如何在Photoshop里抠头发丝
  17. NOIP题库区间合并
  18. 《python从入门到项目实践》第六章 列表和元组 //有一个课后答案
  19. 人工智能发展如何,未来有哪些就业方向?
  20. JVM 之 JDK安装与配置

热门文章

  1. 重装Windows XP系统之前必须进行的备份
  2. antd vue 越过登录直接跳静态页面
  3. 铁路12306首页项目
  4. android局域网udp视频对讲,Android基于UDP语音对讲系列(一)
  5. 什么是点阵液晶屏和段码液晶屏
  6. 提取Wallpaper Engine.pkg文件中的壁纸
  7. 双核心出口三层结构园区网配置(完整版)
  8. Stardust for Mac(ae粒子星辰特效插件) V0.9.1特别版
  9. S01E16 三咲智子:作为一名学生参与开源社区的故事
  10. 《有限元分析基础教程》(曾攀)笔记二-梁单元方程推导(二):简支梁挠曲线近似解...