zoukankan      html  css  js  c++  java
  • es6

    var命令和function命令声明的全局变量,依旧是顶层对象的属性;
    let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
    也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
    • let声明的变量只在它所在的代码块有效。
    • 不存在变量提升
    • let不允许在相同作用域内,重复声明同一个变量
    • 暂时性死区,只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响, 定义之前不能使用。
    • 应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

    for循环的计数器,就很合适使用let命令。

    for (let i = 0; i < 10; i++) {let i = 'abc';}
    // 变量ilet声明的,当前的i只在本轮循环有效,每一次循环的i其实都是一个新的变量
    // 设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
    //死区:
    
    if (true) {
      // TDZ开始
      tmp = 'abc'; // ReferenceError
      console.log(tmp); // ReferenceError
    
      let tmp; // TDZ结束
      console.log(tmp); // undefined
    
      tmp = 123;
      console.log(tmp); // 123
    }
    • const声明一个只读的常量。一旦声明,常量的值就不能改变
    • 不存在变量提升
    • let不允许在相同作用域内,重复声明同一个变量
    • const一旦声明变量,就必须立即初始化,不能留到以后赋值
    • 只在声明所在的块级作用域内有效。
    • 存在暂时性死区

    const,变量指向的那个内存地址所保存的数据不得改动,

    只能保证这个指针是固定的,至于它指向的数据结构是不是可变的。因此,将一个对象声明为常量必须非常小心。

    //  冻结对象:不可添删属性
    const foo = Object.freeze({});
    // 冻结对象,并冻结对象属性
    var
    constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } }); };

    var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

    顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象

  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/avidya/p/10595588.html
Copyright © 2011-2022 走看看