推荐阮一峰老师写的非常详细,我是在此基础上大概的提取出一些知识点
let和const
let 命令
基本用法
ES6新增了let
命令,用来声明变量,基本用法如下
{
let a = 10;
var b = 1;
}
a// ReferenceError: a is not defined.
b//1
此时let
声明报错,var
却返回了正确的值,代表**let
只在他所在的代码块有效**。
不存在变量提升
使用var
时,使用以下代码不会报错,原因是var
会自动提升到函数作用域顶部
function foo(){
console.log(age);
var age = 26;
}
foo(); //underfined
不会报错是因为,它等价于以下代码
function foo(){
var age;
console.log(age);
age = 26;
}
foo(); //underfined
而let
必须在声明后再使用,否则会报错
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
暂时性死区
var
和let
的另外一个重要的区别,就是let声明的变量不会在作用域中被提升。
// name 会被提升
console.log(name); //undefined
var name = 'Matt';
//age 不会被提升
console.log(age); // ReferenceError:age 没有定义
let age = 26;
在let
声明之前的执行瞬间被称为"暂时性死区",在此阶段引用任何后面才声明的变量就会抛出ReferenceError。
不允许重复声明
let
不允许在相同作用域内,重复声明同一个变量。
块级作用域
let
的出现为JavaScript新增了块级作用域。块级作用域的出现,实际上使得获得广泛应用的匿名立即执行函数表达式不再必要了。
ES6 规定,块级作用域之中,函数声明语句的行为类似于let
,在块级作用域之外不可引用。
- 允许在块级作用域内声明函数。
- 函数声明类似于
var
,即会提升到全局作用域或函数作用域的头部。 - 同时,函数声明还会提升到所在的块级作用域的头部。
应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
const命令
行为于let
基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时出错。
const foo;
// SyntaxError: Missing initializer in const declaration
const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
const声明的限制值适用于它指向的变量的引用,所以如果const引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。
const.person={};
person.name = 'Matt';// ok
ES6可以使用六种方法声明变量:var
、fuction
、let
、const
、import
、class
总结
-
let
只在他所在的代码块有效。 -
let
必须在声明后再使用 -
let
不允许重复声明 -
let
没有变量提升 -
允许在块级作用域声明函数
-
块级作用域的函数声明会提升到作用域的头部
-
应该避免在块级作用域声明函数,如果要也应该使用函数表达式
-
对于const而言声明变量时必须同时初始化变量
-
const没有变量提升,有暂时性死区,不允许改变const声明的变量
-
如果const引用的是一个对象,那么修改这个对象内部的属性是可以的