第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前。

1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区,在作用域外面使用变量会报错。

2.在循环中,如for循环,let命令相较于var命令会更好,原因在于所声明的变量不会提前到全局。那么在循环结束以后再调用该变量将无法访问。

3.如果是使用var的for循环,如

var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //

这里后面调用的a[6](),实际上是在调用全局里的i,另外a[i] = 匿名函数,只有当函数被调用时才执行,那么在循环结束后,a[6]()执行,这时候的i只有全局的那个i,也就是10。而如果将var换成了let,结果将会变成6,原因是let声明的每一个i都不提升,所有的i独立在调用函数的时候i实质就是当前循环的i,而i的改变是通过js引擎对上一轮i的记录而修改。

4.使用let声明变量时,for循环中循环条件是父级作用域,循环体是子作用域,两者单独分开,即可以let两个同名变量而不互相影响。

5.暂时性死区:变量使用let声明之后,在块级作用域中声明之前使用将会报错。另外let不允许重复声明变量。还有如let x = x也会报错,因为这里是将x的值赋给x,在未定义x之前就要取得x的值也是暂时性死区,不可取。

6.块级作用域的目的是为了防止变量提升,例如不执行的if语句,会因为变量提升导致内部的值覆盖外部变成Undefined,亦或者执行完之后的for循环的i仍然可以在外部访问。

7.块级作用域允许多层嵌套,内外层变量允许同名,块级作用域可以替代匿名函数的自调用。

8.函数声明式也存在声明提前,所以在ES5中,if条件中声明函数会被提前到当前作用域顶部。在ES6中,为了防止改变导致出现大的问题,所以ES6选择了将函数声明像以var的形式提升,即声明一个函数,其实是var了一个f = undefined。所以应该尽力避免在块级作用域中声明函数,如果要声明请选择函数表达式,f = 匿名函数。

9.let声明变量和声明函数表达式必须带大括号。

今天大概就这样了。


												

12.24 ES6浅谈--块级作用域,let的更多相关文章

  1. ES6 - Note1:块级作用域与常量

    在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...

  2. es6中添加块级作用域的目的

    原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方: 1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例 function createFunctions(){ ...

  3. 《深入理解ES6》笔记——块级作用域绑定(1)

    本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...

  4. 深入理解ES6之《块级作用域绑定》

    众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...

  5. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  6. ES6——块级作用域

    前面的话 过去,javascript缺乏块级作用域,var声明时的声明提升.属性变量等行为让人困惑.ES6的新语法可以帮助我们更好地控制作用域.本文将详细介绍ES6新引入的块级作用域绑定机制.let和 ...

  7. ES6块级作用域

    块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...

  8. ES6的 let const 以及块级作用域

    let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...

  9. ES6 块级作用域

    作用域包括:全局作用域,函数作用域,块级作用域. 为什么要用块级作用域: 1.内层变量可能会覆盖外层变量. var name = "kevin"; function call() ...

随机推荐

  1. list的过滤操作

    假设 l = ['abc', 'mn', 'aq', 'liuming'] 我要过滤出以a开头的元素,方法有以下两种 方法1: l = ['abc', 'mn', 'aq', 'liuming'] l ...

  2. spring boot jar的支持

  3. spring-cloud:Hystrix熔断的使用示例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCl ...

  4. manjaro linux java环境配置

    大佬博客 yaourt jdk 不管怎么装就是会出错 #报错信息 Error: dl failure on line 597 Error: failed /usr/lib/jvm/java-12-op ...

  5. 【Vue】记录一个之前解决跨域问题

    proxyTable: { "/proxy/": {//以/proxy/为开头的适合这个规则 target: "http://192.168.7.72:8000" ...

  6. flutte页面布局四

    AspectRatio 组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由 ...

  7. vue多个input绑定一个数组变量问题

    对于data中声明的一个数组变量arr=[],在绑定时候可以如下: <div style="margin-top: 10px;margin-left: 40px;"> ...

  8. 建站手册-浏览器信息:Google Chrome 浏览器

    ylbtech-建站手册-浏览器信息:Google Chrome 浏览器 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_chrome.a ...

  9. WEUI官方样式小程序工具打开预览

    https://github.com/Tencent/weui-wxss 用微信web开发者工具打开dist目录(请注意,是dist目录,不是整个项目)

  10. 返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。

    错误写法: 正确写法: