Skip to content

Latest commit

 

History

History
61 lines (57 loc) · 2.66 KB

闭包原理及使用场景.md

File metadata and controls

61 lines (57 loc) · 2.66 KB

参考文章

  1. 如何更好的理解Javascript闭包
  2. 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...
  3. 解密JavaScript闭包
  4. Underscore.js的函数部分基本都用到了闭包,可以看一看。目前也正在分析lodash的源码,见Lodash-Source-Code-Analyse

解释

  • 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见方式就是在一个函数内创建另一个函数, 创建的函数可以访问到当前函数的局部变量;这意味着,当前作用域总是能够访问外部作用域中的变量。简单来说, 闭包就是一个访问父函数局部变量的函数。
  • 闭包有两个常用的用途: (1)使我们在函数外部能够访问到函数内部的变量。通过使用闭包,我们可以在外部调用闭包函数,从而在外部访问到函数 内部的变量,可以使用这种方法来创建私有变量。 (2)使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量 对象不会被回收。

举例

//最简单的一种形式:一个父函数 
      function superFunc(){
        // 局部变量
        var _super_a = 1;

        var subFunc = function(){
          // _super_a++;
          alert('_super_a: ' + _super_a);
        }

        return subFunc;
      }
      // superFunc() 得到的是subFunc,superFunc()()等于subFunc()
      superFunc()();

首先,闭包是一个函数(上述示例代码中的subFunc),该函数必须有父函数(上述示例代码中的superFunc),然后调用了父函数的变量。

应用场景

  • 使用闭包可以在JavaScript中模拟块级作用域。(在ES6之前,js本身没有块级作用域的概念)
function outputNumbers(count){
  (function(){
    for(var i = 0; i < count; i++){
      alert(i);
    }
  })();
  alert(i); //导致一个错误!就是永远打印出的都是count的值
}
  • 闭包可以用于在对象中创建私有变量。
function MyObject(){
            // 私有变量和私有函数
            var privateVariable = 10;
            function privateFunction(){
              return false;
            }
            // 特权方法,调用私有方法、函数
            this.publicMethod = function(){
              privateVariable++;
              return privateFunction();
            }
          }