let命令
基本用法
{
let a = 10;
var b = 1;
}
- 有效范围:所声明的变量,只在let命令所在的代码块内有效。var命令声明的,在全局范围内都有效(适用于for循环里)
不存在变量提升
- 变量提升:变量可以在声明之前使用,值为undefined
- 即let命令需要声明后使用
暂时性死区
- 块级作用域内,使用let命令声明变量之前,该变量都是不可用的。
- 作用:主要是为了减少运行时错误,防止在变量声明前就使用这个变量
不允许重复声明
- let不允许在相同作用域内,重复声明同一个变量。
块级作用域
ES6 的块级作用域
- 外层作用域无法读取内层作用域的变量。
- 内层作用域可以定义外层作用域的同名变量。
块级作用域与函数声明
- 允许在块级作用域之中声明函数
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 函数声明还会提升到所在的块级作用域的头部。
(避免在块级作用域内声明函数)
// 函数声明语句(不建议)
{
let a = 'secret';
function f() {
return a;
}
}
// 函数表达式(建议)
{
let a = 'secret';
let f = function () {
return a;
};
}
const 命令
基本用法
const PI = 3.1415;
- 一旦声明,常量的值就不能改变;
- 只在声明所在的块级作用域内有效;
- 不提升,同样存在暂时性死区,只能在声明的位置后面使用。
实质
变量指向的那个内存地址所保存的数据不得改动
(如存储的是一个地址,则不可变的是地址,但可以为其添加属性)
- 将对象冻结,使用Object.freeze方法
const foo = Object.freeze({});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;
顶层对象的属性
- 顶层对象:在浏览器环境指的是window对象,在 Node 指的是global对象
- var命令和function命令声明的全局变量,依旧是顶层对象的属性
- let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
global 对象
- 在全局环境中,this返回的是当前模块。
- 函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined。
- 不管是严格模式,还是普通模式,new Function(‘return this’)(),总是会返回全局对象。
- 可以在所有环境仲从global拿到顶层对象
// CommonJS 的写法
require('system.global/shim')();
// ES6 模块的写法
import shim from 'system.global/shim'; shim();
保证各种环境里面,global对象都是存在的。