ECMAScript6 笔记(一):声明变量

let

let 命令用来声明具有 块级作用域 的变量。通常,我们把包含在 {} 内的代码就称为一个代码块。

暂时性死区(TDZ)

暂时性死区(TDZ, temporal dead zone) 主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。

(function() {
	let i = 0;
	for (i; i < 3; i++)
	{
		console.log(i); // Thrown: ReferenceError: i is not defined
		let i = 2;
		console.log(i);
	}
})();

c 语言中并不会存在暂时性死区的问题,原因是 c 语言中不同作用域中声明的变量所分配的地址不同。

/**
* @file test.c
**/
#include 

int main(void)
{
	int i = 0;
	for (i; i < 3; i++)
	{
		printf("i_out = %d", i); // 0, 1, 2
		int i = 8;
		printf("i_in = %d", i); // 8, 8, 8
	}
	return 0;
}
// 程序正常执行,执行结果请自行编译运行。

不允许重复声明

let 命令不允许在相同作用域内声明同名变量,c 语言中也是如此。

不存在变量提升

ES6 中规定在暂时性死区中和用 let、const 所声明的变量__不__存在 变量提升

const

const 声明一个只读常量,一旦声明,值就不允许被修改。所以,我们在使用 const 命令进行变量的时候就需要立即对该变量进行初始化,否则会报错:Uncaught SyntaxError: Missing initializer in const declaration

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

不能变的是地址指向,而不是值

const 实质上并不保证所声明变量的值不能改变,不能被改变的是该变量的地址所存储的值。

var a = 3;
const b = a;

a = 4; // 这里改变 a 的值并不会报错

ES6 中的块级作用域

ES6 中的 letconstJavaScript 提供了块级作用域。块级作用域的出现使得 IIFE 写法不再必要:

// IIFE
(function () {
	var a = 2;
})();
console.log(a); // 'a' is not defined

// 块级作用域
{ let a = 2; }
console.log(a); // 'a' is not defined

ES6 声明变量的六种方法

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

参考文献

ECMAScript6 入门,阮一峰

你可能感兴趣的:(ECMAScript)