块级声明

块级声明

块级声明:用于在指定块的作用域之外无法访问的变量。块级作用域(词法作用域)存在于

  • 函数内部
  • 块中{这里之间区域}

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


  Reprint please specify: 云深不知处 块级声明

 Previous
循坏中的块级作用域绑定 循坏中的块级作用域绑定
循坏中的块级作用域绑定 for (var i = 0; i < 10; i++) { } console.log(i); console.log(i)由于var声明得到提升,变量i在循坏结束后仍然可以访问。 for (let i
2019-03-10
Next 
var变量提升 var变量提升
Hosting机制:在函数作用域或者全局作用域中通过关键字var声明的变量,无论实际上是在哪里声明的,都会被当作在当前作用域顶部声明的变量。 function getValue(conditon) { if (conditon)
2019-03-10