学透 闭包 一篇就够了

124 阅读2分钟

1、闭包啥意思 ?

  • 闭包 = 函数 + 函数能够访问的自由变量
  • 来,写个代码 展示一下 啥意思
var a = 3;

function foo() {
    console.log(a);
}

foo();

这样就产生了闭包,为什么呢?

函数可以访问变量 a,但是 a 既不是 foo 函数的局部变量,也不是 foo 函数的参数,所以 a 就是自由变量

  • 更全面的定义 1、即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回),并未被释放掉 2、在代码中引用了自由变量,什么时候使用它是未知的会一直存在

2、我们需要详细理解一下 这个过程

*上代码

var scope = "global scope";  // 这个是全局自由变量
function checkscope(){
    var scope = "local scope";  // 这个是函数内使用的局部变量
    function f(){   // 函数内套的 f函数
        return scope;
    }
    return f;
}

var foo = checkscope();
foo();
  • 重点在于 需要理解清楚 整体的过程

  • 那么 这个时候 你需要 思考的问题是 ? 结果怎么来的 当 f 函数执行的时候,checkscope 函数上下文已经被销毁了(从执行上下文栈中被弹出),怎么还会读取到 checkscope 作用域下的 scope 值呢?

  • 回想一下 前面说的 当我们了解了具体的执行过程后,我们知道 f 执行上下文维护了一个作用域链:

fContext = {
   Scope: [AO, checkscopeContext.AO, globalContext.VO],
}

3、写一个 必考题目(没考你来找我)

var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i);
  };
}

data[0]();
data[1]();
data[2]();
  • 答案比较容易 想出来 但是为什么呢 ?
  • 过程 怎么描述 ? 如果 我换成 let i 结果 会变成什么呢?

4、更多信息请看github

github.com/huanhunmao