闭包

简述

函数的执行依赖变量作用域,这个作用域是在函数定义时决定的,而不是函数执行时决定的。为了实现这种词法作用域,JavaScript 函数对象的内部 状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。函数对象可以通过作用域链互相关联起来,函数体内部的变量都可以保存在函数的作用域内, 这就是 “闭包”

也就是说:函数定义时的作用域链到函数执行的时候依然有效。

简单来说,闭包就是指可以访问另一个函数作用域变量的函数,一般是定义在外部函数中的内层函数。

var a = 'window'

function check(){
    var a = 'local';
    function f(){
        console.log(a);
    }
    return f;
}

check()() // local

JavaScript 的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。

var uniqueInteger = (function(){
    var count = 0;
    return function(){ return count++ }
}())

闭包的意义

局部变量无法共享和长久的保存,而全局变量可能造成变量污染。

闭包的特点

  • 占用更多的内存
  • 不容易被释放

何时使用闭包?

既想反复使用,又想避免全局污染。

如何使用闭包?

  1. 定义外层函数,封装被保护的局部变量。
  2. 定义内层函数,执行对外部函数变量的操作。
  3. 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。