zoukankan      html  css  js  c++  java
  • es6之块级作用域

    块级作用域

    在es6(es2015)之前, 也就是es5中,作用域只有两种:
    1. 全局作用域
    2. 函数作用域
    正因为只有这两种作用域, 所以存在 "变量提升" 现象, 即变量可以在声明之前使用,值为undefind.如下

    console.log(tem);//输出undefined
    var tem = 6;

    上面代码中,变量 tem 会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。

    在es6中新增了块级作用域,新增的块级作用域通过 let 和 const 属性来体现:

    console.log(tem);//输出undefined
    let tem = 6;

    下面介绍一下 let 和 const

    let 用法和 var 类似, 但是let声明的变量只在块级作用域内有效

    function fun1() {
      let n = 5;
      if (true) {
        let n = 10;
      }
      console.log(n); // 5
    }

    const 声明的是一个只读的常量.一旦声明, 常量的值就不能再改变,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

    const PI = 3.14;
    PI // 3.14
    
    PI = 3;
    // TypeError: Assignment to constant variable.

    let和const有以下共同点

    1.只在声明的块级作用域内有效
    2.不存在变量提升
    3.存在暂时性死区

    if (true) {
      n = 'abc'; // ReferenceError
      let n;
    }

    ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
    在代码块内,使用let 或 const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

    4.不可重复声明, let 和 const都不允许在同一作用域内重复声明同一个变量

    if(true) {
      let a = 10;
      var a = 1;
    }
    //Identifier 'a' has already been declared
    if(true) {
      let a = 10;
      let a = 1;
    }
    //Identifier 'a' has already been declared
    if(true) {
      const a = 10;
      let a = 1;
    }
    //Identifier 'a' has already been declared
  • 相关阅读:
    c++ stl中的二分查找
    2015年---移动端webapp知识总结
    移动端网站优化指南-WAP篇
    ASO优化总结(基于网络分享的知识总结归纳)
    验证数字的正则表达式集
    个人的浏览器重置样式表(总结)
    微信或移动端网页的meta
    移动端字体和字体大小规范
    min-device-pixel-ratio
    Emmet语法实例(帮助快速开发)
  • 原文地址:https://www.cnblogs.com/yuqing6/p/6777746.html
Copyright © 2011-2022 走看看