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对象

  • 相关阅读:
    代码操作
    购物车
    利息计算器
    生成海报
    知识库
    JavaScript处理字符串--参照W3C
    C#输入排序-冒泡
    enum举例
    C# 表达式计算器----数据结构
    C# 测试单词的完美度
  • 原文地址:https://www.cnblogs.com/avidya/p/10595588.html
Copyright © 2011-2022 走看看