阮一峰ES6读书笔记:let 和 const命令

52 阅读2分钟

let 和 const

  1. 函数赋值
function bar(x =y, y = 2) { 
     return [x, y]; 
 } 
 bar(); // 报错 
 function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2] 函数括号内部可以看成一个作用域,变量由let声明,从左向右 执行。

2.为什么需要块级作用域

  1. 防止内层变量覆盖外层变量:块级作用域中 var 的声明会发生变量提升。
  2. 防止循环变量内存泄漏;
  3. 立即函数执行表达式不需要了;

3.能否在块级作用中声明函数?

  1. es5中不能 只能在顶层和函数中声明;
  2. es6中满足以下三点要求:
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
  • 同时,函数声明还会提升到所在的块级作用域的头部
  • 允许在块级作用域内声明函数。(只在大括号使用时成立)
function f() { 
console.log('I am outside!'); 
} 
(function () { 
  if (false) { 
  // 重复声明一次函数f 
    function f() { 
      console.log('I am inside!'); 
    }
  } 
      f(); 
  }()); 
  //实际执行时
  function f() { 
    console.log('I am outside!'); 
  } 
  (function () { 
    var f = undefined; 
    if (false) { 
       function f() { 
           console.log('I am inside!'); 
        }  
    } 
     f(); 
   }());
   // Uncaught TypeError: f is not a function
  1. const的保证;

变量指向的内存地址不能改变=>基本类型变量不能改变,对象类型可以改变。

使得对象值不可改变的方法:Object.freeze({})

  1. 声明变量的六种方法

var function let const import class

  1. 关于变量声明与顶层对象的关系;

js的败笔:全局作用域声明的变量是顶层对象属性的赋值挂钩。

无法在编译时报变量为声明(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的)

很容易创造出全局变量。

顶层对象可读写,不利于模块化?(不理解)

let和const的创造为了与顶层变量脱钩;