ES6笔记(2)-- let的块级作用域
系列文章 -- 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的块级作用域的更多相关文章
- ES6学习笔记(1)- 块级作用域
1. var声明变量和变量提升(Hoisting)机制的问题 在JS中通过var关键字声明的变量,无论在函数作用域中亦或是全局作用域中,都会被当成当前作用域顶部的变量,和就是所谓的提升机制(Hoist ...
- ES6的 let const 以及块级作用域
let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...
- ES6 let const 声明变量 块级作用域
ES6 中除了使用 var 定义变量,还有let.const,定义变量. function getValue(condition){ console.log(typeof value2); // un ...
- Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域
昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...
- 12.24 ES6浅谈--块级作用域,let
第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...
- 《浏览器工作原理与实践》<09>块级作用域:var缺陷以及为什么要引入let和const?
在前面我们已经讲解了 JavaScript 中变量提升的相关内容,正是由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷 ...
- ECMAScript概述及浅谈const,let与块级作用域
ECMAScript可以看作javascript的标准规范,实际上javascript是ECMAScript的一门脚本语言,ECMAScript只提供了最基本的语言JavaScript对ECMAScr ...
- ES6学习笔记之块级作用域
ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...
- 《深入理解ES6》笔记——块级作用域绑定(1)
本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...
随机推荐
- [你必须知道的NOSQL系列]专题一:MongoDB快速入门
一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...
- Java中类继承、接口实现的一些细节(长期更新)
前言 在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉.不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作.学习中入手,总结一 ...
- SQL Server Profiler使用教程,通俗易懂才是王道
做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上 ...
- FusionCharts简单教程(二)-----使用js加载图像和setDataXML()加载数据
前面一篇对FusionCharts进行了一个简单的介绍,而且建立了我们第一个图形,但是那个是在HTML中使用<OBJECT>和<EMBED>标记来加载图形的,但是这 ...
- Linux shell之打印输出
介绍 经常需要和shell命令打交道,但是一直没有系统的学习,接下来会花1到2个月的时间系统的学习一下shell命令,接下来就开启shell命令的奇妙旅行吧.本章主要介绍shell的打印输出. 知识要 ...
- [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧
前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...
- [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
前言 这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示 ...
- [ACM_动态规划] Alignment (将军排队)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/F 题目大意:有n个士兵排成一列,将军想从中抽出最少人数使队伍中 ...
- Tomcat-MAC下添加Tomcat环境并运行
MAC下添加Tomcat环境运行 1. 首先,下载tomcat.http://tomcat.apache.org/index.html 2. 然后解压.用终端进入到解压文件夹下的bin目录.  ...
- 制作Html标签以及表单、表格内容
制作Html一般用DW(......),Html全称为(Hyper Text Markup Language 超文本标记语言) 文本就是平常电脑上的文本文档,只能存储文字,而超文本文档可以存储音乐 ...