let与块级作用域

  1. {
      var foo='foo';
  2. let bar='bar';
  3. }
  4.  
  5. console.log(foo,'var'); //foo var
    console.log(bar ,'bar');//Uncaught ReferenceError: bar is not defined

在代码中,使用var申明的变量在代码块外面能被识别,但是let命令却不能被识别,这样就实现了js的块级作用域,我们在使用条件语句 循环语句等就会不担心变量污染的问题了,以下是两种写法等对比:

es6:

  1. for (let i = 0; i < a.length; i++) {
  2. let x = a[i]

  3. }
  4. for (let i = 0; i < b.length; i++) {
  5. let y = b[i]

  6. }
  7.  
  8. let callbacks = []
  9. for (let i = 0; i <= 2; i++) {
  10. callbacks[i] = function () { return i * 2 }
  11. }
  12. callbacks[0]() === 0
  13. callbacks[1]() === 2
  14. callbacks[2]() === 4

es5:

  1. var i, x, y;
  2. for (i = 0; i < a.length; i++) {
  3. x = a[i];

  4. }
  5. for (i = 0; i < b.length; i++) {
  6. y = b[i];

  7. }
  8.  
  9. var callbacks = [];
  10. for (var i = 0; i <= 2; i++) {
  11. (function (i) {
  12. callbacks[i] = function() { return i * 2; };
  13. })(i);
  14. }
  15. callbacks[0]() === 0;
  16. callbacks[1]() === 2;
  17. callbacks[2]() === 4;

在{}用let声明的变量只有在{}内是有效的   

let不会有变量提升

熟悉js开发的都知道函数有两种声明方式

  1. a(); // 'a'
  2. b(); // 报错不是一个函数 其实是undefined
  1. function a(){
  2. console.log('a');
  3. }
  4.  
  5. var b=function(){
  6. console.log('b');
  7. }

这两种方式js解析顺序是不一样的, 首先函数a会被js加载然后执行  var b ;至于b是什么数据会等第二批执行,也就是正常按照从上到下执行代码,在执行b()的时候还是未初始化的状态但是并没有报错因为var已经被优先执行了 这种就是变量提升,此时我们修改下代码

  1. a(); // 'a'
  2. b(); // b is not defined
  3. function a(){
  4. console.log('a');
  5. }
  6.  
  7. let b=function(){
  8. console.log('b');
  9. }

虽然仍是报错但是明显提示不存在b变量了,所以使用了let之后就不会优先执行了也会回归“第二批”执行的队伍中,function a(){} 依然是“第一批”优先执行的代码。

变量绑定和不可重新定义

js是存在作用域链的,在特定作用域下只能获取同级或者高层级的变量;但是let存在变量绑定行为,不遵循作用域链;

  1. let a=1;
  2. (function (){
  3. a=2; //a is not defined
  4. let a;
  5. console.log(a);
  6. }());
  7.  
  8. let a=1;
  9. (function (){
  10. a=2;
  11. console.log(a); //2
  12. }());

我们可以这样理解,在当前执行的作用域内如果没有对变量定义 则会从高层级级获取,如果已经存在则封闭当前作用域不再考虑高层级是否声明了该变量;

在相同作用域内,let是不能重复声明同一个变量的;但是var则不在乎声明多少次,永远都是后者替换前者;

  1. var foo=123;
  2. var foo=456;
  3. console.log(foo); //456
  4.  
  5. let bar=123;
  6. let bar=456; //Identifier 'bar' has already been declared
  7. console.log(bar);

有了块级作用域我们再也不用写匿名函数来进行作用域封闭了,以前你可能是这样写:

  1. (function () {
  2. var foo = function () { return 1; }
  3. foo() === 1;
  4. (function () {
  5. var foo = function () { return 2; }
  6. foo() === 2;
  7. })();
  8. foo() === 1;
  9. })();

但是现在不用这样麻烦了,你完全可以这样写: 

  1. {
  2. function foo () { return 1 }
  3. foo() === 1
  4. {
  5. function foo () { return 2 }
  6. foo() === 2
  7. }
  8. foo() === 1
  9. }

参考了了阮一峰的介绍 做了一些简化和自己的例子 欢迎补充~

 

ES6之let命令详解的更多相关文章

  1. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  2. linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  3. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

  4. Docker命令详解

    Docker命令详解   最近学习Docker,将docker所有命令实验了一番,特整理如下: # docker --help Usage: docker [OPTIONS] COMMAND [arg ...

  5. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  6. android adb 命令详解

    ADB (Android Debug Bridge)  是android SDK中的工具,需要先配置环境变量才能使用.起调试桥的作用,可以管理安卓设备.(也叫debug工具) ---------查看设 ...

  7. Git 常用命令详解

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  8. Top 命令详解

    Top 命令详解 先感受一下top命令的执行结果吧!哈哈-- top - 17:32:34 up 3 days, 8:04, 5 users, load average: 0.09, 0.12, 0. ...

  9. Ruby Gem命令详解

    转自:http://www.jianshu.com/p/728184da1699 Gem介绍: Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.o ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  3. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  4. 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  5. 让 windows 下的命令行程序 cmd.exe 用起来更顺手

    在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...

  6. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  7. jQuery动画-圣诞节礼物

    ▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...

  8. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  9. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

  10. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...