ES6新增语法之一
var、let、const三者的区别
首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展。
2011 年,ECMAScript 5.1 版发布。之前我们大部分人用的也就是ES5
2015 年 6 月,ECMAScript 6 正式通过,成为国际标准。
前奏:块级作用域 {}
ES5 中作用域有:全局作用域、函数作用域。没有块作用域的概念。
ES6 中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。
(1)块级作用域
var定义的变量,var定义的变量可以修改,如果不初始化会输出undefined,不会报错。没有块的概念,可以跨块访问, 不能跨函数访问。
let定义的变量,let是块级作用域,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
const用来定义常量,const定义的变量不可以修改,而且必须初始化。使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
(2)不存在变量的提升
var命令会发生“变量提升”的现象。即变量可以在声明之前使用,值为undefined。
let命令所声明的变量一定要在声明后使用,否则会报错。
//var的情况
console.log(foo); //输出undefined
var foo=2;
//let的情况
console.log(bar); //报错
let bar=2;
(3)暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上称为“暂时性死区”。
var tmp=123;
if(true){
tmp='abc'; //报错
let tmp;
}
目的:主要是为了减少运行错误。
(4)不允许重复声明
let不允许在相同作用域内重复声明同一个变量。
//报错
function () {
let a = 10;
var a=1;
}