1. let 命令
- let命令用法和
var差不多
,声明的变量只在所在的代码块(作用域)内有效。
{
let a = 1;
}
a // ReferenceError: a is not defined.
- 不存在“变量提升”,在声明前调用,会报错。
console.log(a); // ReferenceError: a is not defined.
let a= 2;
- 只要块级作用域内存在
let
命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。
var a= 123;
{
a = "abc"; // ReferenceError
let a;
}
- 只要在该作用域内,重复声明变量就会报错。
// 报错
function func() {
let a = 10;
var a = 1;
}
2. const 命令
- const命令用于声明一个常量,一旦被申明就不能改变。改变常量的值会报错。
const P = 3.1415;
P = 3; // TypeError: Assignment to constant variable.
- 只声明不赋值,就会报错。
const foo;
// SyntaxError: Missing initializer in const declaration
以下与let 命令相同:
- 不存在“变量提升”,在声明前调用,会报错。
- 只要块级作用域内存在const命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。
- 只要在该作用域内,重复声明变量就会报错。
const本质:
const不能改变不是
变量的值,而是变量指向的那个内存地址所保存的数据不得改动。因此就有了以下情况
const foo = {};
// 为 foo 添加一个属性,不会报错
foo.prop = 123;
foo.prop // 123
可以通过冻结的方式,使const声明的常量失效。
3. var、let 及const的对比
解释 | var | let | const | |
---|---|---|---|---|
变量提升 | 变量可以在声明之前使用 | √ | × | × |
暂时性死区 | 块级作用域内存在该命令所声明的变量,就“绑定”这个区域,不再受外部的影响 | × | √ | √ |
块作用域 | 详见本文4.块作用域 | × | √ | √ |
重复声明 | 允许在相同作用域内重复声明同一个变量 | √ | × | × |
必须设初始值 | 声明变量时必须设置初始值 | × | × | √ |
可以改变值 | 变量声明后,可以修改变量的值 | √ | √ | × |
4. 块作用域
- 为什么需要块作用域:内层变量可能因为变量提升,重复声明等原因覆盖外层变量;用于计数的循环变量(如for循环中常用的 i )泄露为全局变量
- 概念:在作用域中可以调用外层作用域的变量,外层作用域中无法调用内层变量,犹如一个只能进不能出的保护膜
- 当内外层作用域都申明了同一变量时,两者相互独立,外层代码块不受内层代码块的影响。
{
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}