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 结果 会变成什么呢?