ES6 声明变量的六种方法
ES5 只有两种声明变量的方法:var命令和function命令。ES6除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有6种声明变量的方法。
let 命令
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
使用
-
for循环使用 (不会产生全局变量 )
-
不存在变量提升
存在暂时性死区问题形式- 提前声明
//会报异常不会报未定义 typeof x; // ReferenceError typeof y; // "undefined"
- 参数声明
function bar(x = y, y = 2) { return [x, y]; } bar(); // 报错 function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2]
- 定义声明
// 不报错 var x = x; // 报错 let x = x; // ReferenceError: x is not defined
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
Const 命令
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
关于使用
- const声明一个只读的常量。一旦声明,常量的值就不能改变。
- const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
- const声明的常量,也与let一样不可重复声明。
块级作用域
作用
- 防止内层变量可能会覆盖外层变量。
- 用来计数的循环变量泄露为全局变量。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
块级作用域与函数声明
ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
顶层对象的属性
顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。ES5之中,顶层对象的属性与全局变量是等价的。
var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1
let b = 1;
window.b // undefined
global 对象
获取全局对象的方法
// 方法一
(typeof window !== 'undefined'
? window
: (typeof process === 'object' &&
typeof require === 'function' &&
typeof global === 'object')
? global
: this);
// 方法二
var getGlobal = function () {
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');
};