开始学习ES6
,这里是第一篇笔记,首先记录了2个基础的let
和const
关键字。
let
let 关键字带来了块级作用域。
在es6
之前,我们只有全局作用域和函数作用域,而let
的出现宣示着块级作用域的到来,我觉得这是JavaScript
在逐渐变得严谨起来,并向我们扔出了一系列的“语法糖”。
// 传统的 var 关键字
var a = [];
for(var i = 0; i < 6; i++){
a[i] = function(){
return i;
}
}
a[3](); // 6
a[5](); // 6
// ES6 新增的 let 关键字
var b = [];
for(let j = 0; j < 6; j++){
b[j] = function(){
return j;
}
}
b[3](); // 3
b[5](); // 5
let 不存在变量提升
var
关键字在声明变量时,会有一种“变量提升”(预解析)机制(提醒自己一下:function
函数声明也一样,优先级要比变量提升要高,函数表达式等同变量声明)。然而,let
却不存在变量提升机制:
function foo(){
a = 6;
console.log(a);
let a;
}
foo(); // Uncaught ReferenceError: a is not defined
暂时性死区(temporal dead zone,简称TDZ)
其实,不止变量提升,let
或const
声明的变量有更严格的设置,let
或const
声明的变量会绑定所在块级作用域。假如说,我用let
或const
声明了一个变量variable1
,那么在作用域内,在声明语句前引用该变量都会导致错误,即使该变量在外部有声明或赋值。
var variable1 = "kawi";
function foo(){
typeof(variable1);
let variable1;
}
foo(); // Uncaught ReferenceError: variable1 is not defined
上面例子中代码与变量提升的非常相似,但要解释的东西完全不一样。
禁止重复声明
以往在编写JavaScript
代码时,var
关键字过于灵活的特性以至于我们可能在某些业务场景中不严谨的重复定义某个变量。例如:
for(var i=0; i<3;){
i++
}
console.log(i); // 3
for(var i=0; i<6;){
i++
}
console.log(i); // 6
前面已经领会过let
和const
有多讲究严谨,重复用它们定义一个变量,是会导致错误的:
function foo(param){
let param = 1; // Uncaught SyntaxError: Identifier 'param' has already been declared
}
function foo(){
let param = 1;
var param = 2; // Uncaught SyntaxError: Identifier 'param' has already been declared
}
块级作用域的嵌套
像下面这样的嵌套是可以的:
{
let a = 1;
{
let a = 2;
console.log(a); // 2
}
}
const
const
关键字用于定义恒量,也就是不变的值。
const 是可读的,不可写的。
const a = 1;
a = 2; // Uncaught TypeError: Assignment to constant variable.
const 声明变量时一定要赋值。
const a; // Uncaught SyntaxError: Missing initializer in const declaration
a = 2;
const 声明变量,并赋值引用类型
当我们用const
定义一个变量,并赋值一个引用类型对象,这个对象是可以修改的。例如:
const arr = [];
arr[1] = 1;
console.log(arr.length); // 2
原因,指针嘛,指针不变就OK啦!
(PS:在ES6
中一共有6个关键字:var
,function
,let
,const
,import
,class
)