块级声明
块级声明:用于在指定块的作用域之外无法访问的变量。块级作用域(词法作用域)存在于
- 函数内部
- 块中{这里之间区域}
let声明
- let可以把变量限制在当前作用域中
同一作用域
let禁止重复定义已经存在的标识符
变量value被let关键字声明之后不再被提升至函数顶部,执行流离开if块,value立刻被销毁。如果condition值为false,就永远不会声明并初始化value。
function getValue(conditon) {
if (conditon) {
let value = "blue";
return value;
} else {
// return null
console.log(value);
}
}
getValue('')
ReferenceError: value is not defined
const声明
- const声明的是常量,其值一旦被设定后不可更改。通过const声明的常量必须进行初始化。
- 在同一作用域用const声明已经存在的变量也会导致语法错误
const maxItems = 30;
const maxItems = 10;
const name;
const name报错:SyntaxError: Missing initializer in const declaration
const maxItems = 10报错: SyntaxError: Identifier ‘maxItems’ has already been declared
let 和 const
const 和 let 都是块级标识符,所以常量也是在当前代码块内有效,一旦执行到块外会立即被销毁。常量同样不会提升至作用域顶部。
if (condition) {
const maxItems = 5;
}
//此处无法访问maxItems
//ReferenceError: maxItems is not defined
const声明对象
const声明对象不允许修改绑定,但允许修改该对象的属性值。
- 修改绑定是变量指向的地址变了
- 修改值是变量指向的地址没变,但是地址上的值变了
const person = {
name :"Nicholas"
}
person = {
name : "Greg"
}
person.name = "Greg"
//类型错误:分配给常量变量。 TypeError: Assignment to constant variable.
person.name修改的是person包含的值
如果直接给person赋值,即要改变person的绑定,就会报错
临时死区(TDZ)
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在代码块内,使用 let 和 const 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (condition) {
console.log(typeof value);
let value = "bule";
}
// ReferenceError: value is not defined
console.log(typeof value)会抛出语法错误,用let定义并初始化变量value语句不会执行。此时value还位于JavaScript社区所谓的临时死区中。
TDZ用来描述let和const变量不提升效果。
console.log(typeof value);//undefined
if (condition) {
let value = "bule";
}
typeof是在声明变量value的代码块之外执行的,此时value并不在TDZ中,这也就意味着不存在value这个绑定,typeof操作最终返回undefined