1.let关键字
先放let关键字声明变量的特点总结:
-
let关键字可以将变量绑定到当前所在作用域(通常是{ .. }内部)
-
无法在块级作用域之外的地方访问使用let命令声明的变量
-
不允许使用let关键字多次声明同一个变量
-
不存在变量提升,使用let关键字声明的变量一定要在声明之后使用,否则将报错
1.let关键字可以将变量绑定到当前所在作用域(2.无法在块级作用域之外访问声明的变量)
js的函数作用域不用说了,在函数内不论是用var还是let声明的变量是无法直接被外界访问到的。
但是JS的块级作用域,如:for(){ .. }
、if(){ .. }
、{ .. }代码块
等这种都是属于块级作用域,在这些块级作用域中使用var关键字声明的变量,是可以直接在块级作用域以外的地方访问到的,这样会增加污染全局变量的风险。
就像这样:
var a = 1;
if (true) {
var a = 2
}
console.log(a) // a
由于if循环里用var关键字重新给a赋了值,因此打印出来a是2。我们肯定不希望全局的a = 1
被污染,此时用let关键字就可以解决这个问题:
var a = 1;
if (true) {
let a = 2
}
console.log(a) // 1
此时在for循环里用let声明的a就被绑定到了这个for循环块级作用域中,在for循环代码块之外也就无法访问到了。
3.不允许使用let关键字多次声明同一个变量
这个非常容易理解了,就是一个变量无法用let关键字声明多次。
使用var关键字可以将同一个变量a多次声明为不同的值,但是使用let关键字声明的变量却只能声明一次,否则将报错:
let a = 1
let a = 2 // Uncaught SyntaxError: Identifier 'a' has already been declared
4.不存在变量提升
var关键字声明的变量存在变量提升问题
,就像下面:
console.log(a); // undefined
var a = 1
上面的var a = 1
会被拆分成这样:
var a
console.log(a) // undefined
a = 1
这就是变量提升,用var关键字声明的变量会先被提升到所在作用域的最顶端,等实际赋值时才将a赋值为1。
let关键字就可以避免这个问题,它会提前抛出异常:
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 1
2. const关键字
const关键字用来声明只读的一个常量。用const声明的变量的值无法被修改。不过需要注意的是声明的变量的类型是基础类型还是引用类型。
-
基础类型(Number、Boolean、String等)值就保存在变量指向的那个内存地址,因此等同于常量。
-
引用类型(Object、Array等)变量保存的只是一个指向书记数据的指针,const只能保证指向这个指针的值是不变的,至于它的数据结构是否改变时无法控制的
const关键字和let一样也可以把当前变量绑定到当前作用域中。
3.ES6声明变量的6中方法
ES5只有两种声明变量的方式:var
和function
。ES6除了添加let
和const
命令,还加了两种声明变量的方式:import
和class
命令