let和const
标签(空格分开): es6
let敕令
这个敕令是用来说明变量的,然则和es5
差别的是,用它来声明的变量是部分变量,存在于部分作用域(blocked scope)
:
var a = 1;
console.log(this.a); ===> 1
let a = 1;(部分变量,不会挂载在window或global下)
console.log(this.a); ===> undefined
另外,在写es5
的时刻经常会碰到变量提拔的状况,比方:
if(true) {
console.log(a); ====> undefined
var a = 1;
}
if(true) {
console.log(a); ====> 报错
let a = 1;
}
即,假如运用let
举行变量说明的话,一定要先说明再运用
const敕令
声明一个immutable
(不可转变)的变量,而运用let
说明的变量是mutable
。然则须要注重的处所是运用const
说明的变量是这个变量的自身只可能有一个值,是immutable
的,然则并不指着个值是immutable
的。这个值照样能够转变的。比方:
cosnt obj = {}; //运用const声清楚明了一个immutable的变量
obj = {} //从新对这个变量赋值,那末就会报错了
const obj = {};
obj.name = 'XL';
console.log(obj); // {name: 'XL'}这个时刻是一般的
temporal dead zone
经由历程let
或const
声明的变量都有一个temporal dead zone(TDZ)
:当进入这个TDZ
时,假如语句没有实行到说明这个变量时,在此之前get
或许set
这个变量都是会报错的.然则经由历程var
说明的变量没有TDZ
。
经由历程var说明的变量的性命轮回
当进入到
var
变量的作用域中时,便为这个变量分配了存储空间。同时这个变量立即被初始化,初始值为undefined
.当语句实行到赋值语句时,这个变量转变其初始值。
经由历程let说明的变量的性命轮回
当进入
let
说明变量的作用域中时,为这个变量分配了存储空间。然则这个变量并未没初始化。对一个还未初始化的变量举行
get/set
操纵将会引发ReferenceError
。当语句实行到赋值语句时,这个变量转变其初始值。
const
声明的变量必需一开就要赋值,而且这个变量不能被给予新的值。
const a;
a = 'XL'; ====> 报错
在轮回中的表现: var VS let VS const
for
for-in
for-of
for轮回当中
const arr = [];
for(var i = 0; i < 3; i++) {
arr.push(() => i);
}
arr.map(x => x()); //[3, 3, 3]
经由历程运用var
说明变量时,会为这个值举行一次赋值,每次轮回时都邑从新对这个变量举行赋值。因而末了输出时,返回的是雷同的值
const arr = [];
for(let i = 0; i < 3; i++) {
arr.push(() => i);
}
arr.map(x => x()); //[0, 1, 2]
运用let
说明变量的时刻。每次轮回历程,都相当于在一个新的blocked scope
内里声明一个变量,它们相互之间没有影响,因而末了返回的值也不雷同。
for-of轮回和for-in轮回
const arr = [];
for(var i of [0, 1, 2]) {
arr.push(() => i);
}
arr.map(x => x()); //[2, 2, 2]
运用var
说明变量时和for
轮回一样。
const arr = [];
for(let i of [0, 1, 2]) {
arr.push(() => i);
}
arr.map(x => x()); //[0, 1, 2]
运用let
举行轮回时和for
轮回一样。
运用const
所到达的结果和let
雷同,不过经由历程const
说明的变量是immutable
的。
for-in
的运转历程和三者的表现和在for-of
轮回历程当中类似。
parameters
假如运用let
去说明一个和形参名字雷同的变量的时刻,将会报错
function func(arg) {
let arg; //static error: duplicate declaration of 'arg'
}
然则假如运用var
去说明的话,则不会报错,其到达的结果就是从新声明一个变量掩盖的掉了形式参数。
function func(arg) {
var arg;
}
Coding style: const VS let VS var
假如你要定义一个
immutable varity
(原始值
和Forzen Objects
)时,只管运用const
。假如要定义一个初始值可能会发生变化的变量时,只管运用
let
。在全局环境下经由历程
var
来说明的变量是能够挂载到全局对象(window/global
),然则你完全能够经由历程直接在window/global
去定义这个变量/属性
。
参考: