系列文章 -- ES6笔记系列

一、函数级作用域

我们都知道,在ES6以前,JS只有函数级作用域,没有块级作用域这个概念

没有块级作用域,有利有弊,利于方便自由,弊于作用域内的变量容易被共享,例如这个例子

var a = [];

for (var i = 1; i <= 10; ++i) {
a[i] = function() {
return i;
};
} a[3]() //

循环中变量i是处于全局作用域下的,其实这里是个闭包,函数内部的i与函数外的i形成了引用的关系,导致函数退出之后i未被销毁,引用的依然是全局的i

循环完成,此时i已经是11,调用之,则值皆为11

二、块级作用域

1. let的简单使用

这是没有块级作用域支持的经典例子,ES6则引入了这个特性,通过let关键字,形成“块级的作用域”

let和var类似,用来声明变量,那么,把上方中的var换成let

var a = [];

for (let i = 1; i <= 10; ++i) {
a[i] = function() {
return i;
};
} a[3]() //

这是正确的结果,因为let使for循环变成了一个“块级作用域”,类似的还有if、while的“块级作用域”

if (1) {
let a = 10;
var b = 11;
} console.log(a); // undefined
console.log(b); //

2. let 的一些特点

1)不能重复声明,var重复声明会被覆盖,但let重复声明会报错

var aa = 1;
var aa = 2; let bb = 1;
let bb = 2; // Uncaught SyntaxError: Identifier 'bb' has already been declared

2)不存在变量提升,如下做法会报错

console.log(a2); // Uncaught ReferenceError: a2 is not defined
console.log(b); // undefined let a2 = 10;
var b = 11;

3) 存在暂时性死区(temporal dead zone),只要块级作用域内存在let的声明,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响

var a3 = 3;

if (1) {
a3 = 1; // Uncaught ReferenceError: a3 is not defined
let a3;
}

此外,不单是显示的let才存在死区这种状态,在函数的默认参数之中也会发生,如下的b未声明则直接使用a = b会报错

function bar(a = b, b = 2) {
return [a, b];
} bar(); // Uncaught ReferenceError: b is not defined

4)let与window对象脱钩

一般来说,全局var声明的变量,会挂钩在window对象上,但let却不会这样,如

var aa = 1;
let bb = 1; console.log(window.aa);
console.log(window.bb);

3. 函数的使用

1)匿名函数

没有块级作用域之前,为了整合代码,更好的分块不予外部代码混淆,我们常常使用匿名函数的自执行方式

(function() {
console.log(1); //
})();

但或许现在不再需要了,直接使用一对(或多对)大括号,就有了块级的作用域

{
console.log(1); //
}

4. const的常量声明

const声明了一个只读的常量,常量,即值不可更改。

const MAX = 10;
MAX = 11; // Uncaught TypeError: Assignment to constant variable.

const除了拥有let上述的特点之外,还有一些要注意的点

1)const一旦声明变量,就必须立即初始化,否则报错

const MAX; // Uncaught SyntaxError: Missing initializer in const declaration

2) const声明的引用类型

const声明的引用类型,只是引用类型的地址不能更改,但其指向的值是可以的,如

const obj = {
a: 10
}; obj.a = 11; obj.a //

ES6笔记(2)-- let的块级作用域的更多相关文章

  1. ES6学习笔记(1)- 块级作用域

    1. var声明变量和变量提升(Hoisting)机制的问题 在JS中通过var关键字声明的变量,无论在函数作用域中亦或是全局作用域中,都会被当成当前作用域顶部的变量,和就是所谓的提升机制(Hoist ...

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

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

  3. ES6 let const 声明变量 块级作用域

    ES6 中除了使用 var 定义变量,还有let.const,定义变量. function getValue(condition){ console.log(typeof value2); // un ...

  4. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  5. 12.24 ES6浅谈--块级作用域,let

    第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...

  6. 《浏览器工作原理与实践》<09>块级作用域:var缺陷以及为什么要引入let和const?

    在前面我们已经讲解了 JavaScript 中变量提升的相关内容,正是由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷 ...

  7. ECMAScript概述及浅谈const,let与块级作用域

    ECMAScript可以看作javascript的标准规范,实际上javascript是ECMAScript的一门脚本语言,ECMAScript只提供了最基本的语言JavaScript对ECMAScr ...

  8. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

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

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

随机推荐

  1. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

  2. ubuntu 安装 axel

    Axel 通过打开多个 HTTP/FTP 连接来将一个文件进行分段下载,从而达到加速下载的目的.对于下载大文件,该工具将特别有用. 安装:sudo apt-get install axel 一般使用: ...

  3. C#入门基础三四

    数组:数组是一组具有相同类型的值的集合,可以通过索引来访问数组中的元素. 声明数组的语法: A.数据类型 [] 数组名称: B.数据类型 [] 数组名称 = new 数据类型[数组大小]; C.int ...

  4. jdk研究——java.lang

    jdk研究 volatile 是什么意思? 如何看jdk源码? 如何调试源码!---------仔细解读关键类,关键代码,常用的api的解释! 自己有疑问的不懂地方-------- 不懂的太多怎么办. ...

  5. MVVM架构~knockoutjs与MVC配合,实现列表的增删改功能

    返回目录 MVC与MVVM的模型 在MVC实例项目中,为我们提供了简单的增删改查功能,而这种功能的实现与具体的Model很有关系,或者说它与后台数据库的关系过于紧密了,而对于开发人员来说当页面布局修改 ...

  6. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

    Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...

  7. 每天一个linux命令(50):crontab命令

    前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...

  8. 利用@property实现可控的属性操作

    利用@property实现可控的属性操作 Python中没有访问控制符, 不像java之类的 public class Person{ private int x public int getAge( ...

  9. 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)

    通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的 ...

  10. Java——List集合

    package om.hanqi.test; import java.util.ArrayList; import java.util.List; public class Test01 { publ ...