前言
前段时间,发现js中有人在用let。本人茫然了,这是个啥,js中定义变量我只认识 var 。
后来才发现,自己真是out了。(也可能之前接触的都是 ECMA5,汗颜!!!)
不过,不想学习,一直吃老本的程序员,不是好程序员。我决定,好好看看这块的东西。那么,第一步就是这let了。查了下资料,我才发现原来这 ES6我还真就接触过,在 Vue 中,const 定义的那么多变量…
话不多少,开整!
let 的特点
首先,它是用来定义变量的。那就先是试试呗~
1、声明变量在同一个代码块{}中不能重名
如下案例中,定义第二个变量,取名做 a 时,就报错了。
let a = 5;
// 当解析到第二个a时,会报错
// Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 6;
2、虽然属于块级作用域,但是仍遵循作用域链
如下案例中,在函数 printB 中使用 b 变量,是不会报错的。这一点可以体现 let 定义的变量是遵循作用域链的。
但是在 let 的块{} 外边使用 b 变量时,却是会报错,提示说该变量未定义。
但是,var 只有全局作用域和函数作用域概念
{
let b = 9;
function printB(){
console.log(b);
}
printB();
}
// Uncaught ReferenceError: b is not defined
console.log(b);
3、let 定义的变量不存在变量提升
所谓变量提升,简单来说,其实是 js 在执行的时候,是将声明变量和给变量赋值分开的。
先执行所有的声明,再执行赋值。
这一点可以和 var 定义的变量做比较来看。
let 的案例:先使用变量 c ,然后在给 c 赋值,这种是办不到的。
{
// 不存在变量提升
// Uncaught ReferenceError: Cannot access 'c' before initialization
// console.log(c)
let c = 'IloveU'
}
var 定义的变量是可以变量提升的,也就是以下情况:
控制台会输出 “我真帅”
d = '我真帅'
var d
console.log(d)
但是,如果直接就打印输出 d 的话,会是 undefined 。
综上所述,let 几乎可以取代 var 了,在使用时,需要尽可能选择作用域小,而同时又能满足我们的需求的方式。
const 的特点
const 在作用域上来看,和 let 是一样的,都属于块级别,都不存在变量提升。
const 在同一代码块(同一作用域下),是不能重名的。(这一点 var 是可以重名的)
但是,const 又有它自己的特殊的地方:
const 定义的是常量,即一开始必须赋初值(不能用null做初值)而且该值不可改变,特殊的,如果是对象类型,不在不可改变的范畴,对象的属性还是可以改的。
const 的本质:在定义普通变量时,就和定义一个常量一样;在定义对象、数组时,实际上相当于一个指针指向一个固定的内存地址,该地址存放的数据可以改变,但地址不能变。
一个通俗的例子,将这地址假设为你家的地址,你家地址不能变。可是你家里的家具,人数都是可以变的。
另外请参见:阮一峰 let 详述
暂存死区
这暂存死区,其实主要还是 let 的作用域,以及变量就近原则的问题。
以下案例中,在{}中,e定义的变量是先找 let 定义的,而let 又不能变量提升,因此报错。
var e = 6;
{
// Uncaught ReferenceError: Cannot access 'e' before initialization
e = 10;
let e = 1
}