块级作用域

块级作用域解决的问题

  • 内存变量对外层变量的覆盖

    var tmp = new Date();
    
    function f() {
      console.log(tmp);
      if (false) {
        var tmp = 'hello world';
      }
    }
    
    f(); // undefined
    

    提示:内部代码块变量提升,覆盖外部代码块的变量

  • 变量泄露成全局变量(for遍历计数器)

    var s = 'hello';
    
    for (var i = 0; i < s.length; i++) {
      console.log(s[i]);
    }
    
    console.log(i); // 5
    

    提示:循环之后,变量i并没有消失,泄露成了全局变量

块级作用域的优势
  • 外层代码不受内部影响

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

    提示:外部代码块不受内部影响,let n = 5绑定内部代码块

  • 允许块级作用域任意嵌套

  • 内层作用域可以定义外层作用域的同名变量,每一层都是一个单独块级作用域

  • 块级作用域使得立即执行函数不再那么重要

    // IIFE 写法
    (function () {
      var tmp = ...;
      ...
    }());
    
    // 块级作用域写法
    {
      let tmp = ...;
      ...
    }
    

results matching ""

    No results matching ""