ES6 知识摘要

let和const命令

1.let命令

let 只在let命令所在的代码块内有效。

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1
for (let i = 0; i < arr.length; i++) {}

console.log(i);
//ReferenceError: i is not defined

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

不存在变量提升

let不像var那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。

console.log(foo); // 输出undefined
console.log(bar); // 报错ReferenceError

var foo = 2;
let bar = 2;

暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var tmp = 123;

if (true) {
  tmp = ‘abc‘; // ReferenceError
  let tmp;
}

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。

不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

// 报错
function () {
  let a = 10;
  var a = 1;
}

// 报错
function () {
  let a = 10;
  let a = 1;
}

function func(arg) {
  let arg; // 报错
}

function func(arg) {
  {
    let arg; // 不报错
  }
}

2.块级作用域

ES6的块级作用域

let实际上为JavaScript新增了块级作用域。

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

内层作用域可以定义外层作用域的同名变量。

{{{{
  let insane = ‘Hello World‘;
  {let insane = ‘Hello World‘}
}}}};

块级作用域与函数声明

ES6规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

// 函数声明语句
{
  let a = ‘secret‘;
  function f() {
    return a;
  }
}

// 函数表达式
{
  let a = ‘secret‘;
  let f = function () {
    return a;
  };
}

另外,还有一个需要注意的地方。ES6的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。

// 不报错
‘use strict‘;
if (true) {
  function f() {}
}

// 报错
‘use strict‘;
if (true)
  function f() {}

3.const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。对于const来说,只声明不赋值,就会报错。

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

const声明的常量,也与let一样不可重复声明。

对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。

const foo = {};
foo.prop = 123;

foo.prop
// 123

foo = {}; // TypeError: "foo" is read-only

如果真的想将对象冻结,应该使用Object.freeze方法。

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;

ES5只有两种声明变量的方法:var命令和function命令。ES6除了添加letconst命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6一共有6种声明变量的方法。

4.全局对象的属性

全局对象是最顶层的对象,在浏览器环境指的是window对象,在Node.js指的是global对象。

未声明的全局变量,自动成为全局对象window的属性,这被认为是JavaScript语言最大的设计败笔之一。这样的设计带来了两个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道,其次程序员很容易不知不觉地就创建了全局变量(比如打字出错)。另一方面,从语义上讲,语言的顶层对象是一个有实体含义的对象,也是不合适的。

ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐步与全局对象的属性脱钩。

var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined
时间: 2024-11-03 22:13:03

ES6 知识摘要的相关文章

ES6知识整理(5)--对象的扩展

个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习.可能是因为还没找的动力源吧,还在寻找中……希望能找到动力,并坚持地积累下去. (文章会同步到博客园,技术类文章还是该让搜索引擎察觉比较好) 属性.方法简介表示法 属性简写: 传统返回法 es6返回法 结果是一样的. 方法简写: 传统写法 es6写法 结果也一样. 属性赋值器与取值器 赋值器sett

es6知识总结

学习地址:http://web.jobbole.com/86441/ http://www.cnblogs.com/Wayou/p/es6_new_features.html视频地址:http://study.163.com/course/courseLearn.htm?courseId=1003938030#/learn/video?lessonId=1048001010&courseId=1003938030 http://study.163.com/course/courseMain.ht

SQLite 知识摘要 --- 事务

在许多时候,我们在使用大数据的时候会发现,尽管sqlite数据库的执行效率已经很快了,但是还是满足不了我们的需求,这时候我们会很容易考虑到使用并发的方式去访问sqlite数据库,但是sqlite数据独有的机制有会让我们在使用中遇到各种问题,如死锁,报错等等.下午就详细介绍一下sqlite的事务,了解sqlite事务对我们并发操作sqlite数据库具有极大的帮助. 本篇预备知识 我们先来了解下SQLite执行事务的基本流程,状态变化过程,再分析怎么使用才更优.SQLite定义的锁的状态有如下几种:

ES6知识整理(8)--Promise对象

(关于promise,以前并不知道是什么,没这个概念.现在来学习总结下) promise含义 es6的异步编程解决方案.需要new新对象操作api. promise对象特点 有3中状态:pending(进行中).fulfilled(已完成).rejected(已失效),异步操作才有的状态. 2种状态的改变结果,称为:已定型(resolve): 即可将异步操作变为同步操作,避免层层嵌套回调函数. promise缺点: 对象创建后会立即执行,中途不可中断. 不设置回调时,将抛出异常,不影响外部执行.

Vue的三个点es6知识,扩展运算符

Vue中的三个点在不同情境下的意思 操作数组 //里面放自己定义的方法 methods: { /** * 把数组中的元素孤立起来 */ iClick() { let iArray = ['1', '2', '3']; console.log(...iArray); // 打印结果 1 2 3 }, /** * 在数组中添加元素 */ iClick3() { let iArray = ['1', '2', '3']; console.log(['0', ...iArray, '4']); // 打

汇编语言基础知识摘要(《汇编语言》王爽)第 2 / 17 章

一个典型的CPU由运算器.控制器.寄存器等器件构成,这些器件靠内部总线相连.第一章中所说的总线,相对于CPU内部来说是外部总线.内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系.简单地说,在CPU中: 运算器进行信息处理: 寄存器进行信息存储: 控制器控制各种器件进行工作: 内部总线链接各种器件,在它们之间进行数据的传送. 对于一个汇编程序员来说,CPU中的主要部件是寄存器.寄存器是CPU中程序员可以用指令读写的部件.程序员通过改变各种寄存器中的内容来实现对CP

汇编语言基础知识摘要(学习《汇编语言》王爽)

CPU,是计算机的核心部件,它控制整个计算机的运作并进行运算. 寄存器,是CPU中可以储存数据的器件,一个CPU中有多个寄存器. 汇编语言由以下3类指令组成: 汇编指令:机器码的助记符,有对应的机器码. 伪指令:没有对应的机器码,由编译器执行,计算机并不执行. 其他符号:如+.-.*./ 等,由编译器识别,没有对应的机器码.

汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章

字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成.高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节. 在以后的课程中,我们将起始地址为N的字单元简称为N地址字单元.比如一个字单元有2.3两个内存单元组成,则这个字单元的起始地址为2,我们可以说这是2地址字单元. 任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元的高位字节单元和地位字节单元. DS寄存器,是一个段寄存器,通常用来存放

TinkPHP 简单知识摘要

1.Session处理 赋值:session('name','value'); //设置session 与 $_SESSION['think']['name'] = 'value';相等 取值:$value = session('name'); $value = $_SESSION['think']['name'];//相同 删除:session('name',null); unset($_SESSION['think']['name']);//相同 清空:session(null); unse