- 亲们,首先闭包是一种机制,一种机制,一种机制。
- 我们知道,在函数执行时候,会形成一个全新的私有上下文,这个上下文会进栈进行执行。在执行完毕后,正常来说,是要出栈进行释放的,但是有时候上层上下文会引用该私有上下文的内容,比如私有变量、私有方法等,导致其不能销毁内存,无法释放。这就说闭包。
- 其实从本质来说,函数执行的时候,形成的私有上下文,内部存储的变量方法等,都是在私有空间中,所以起到了 保护的作用。
- 当上下文不会被销毁的时候,所存储的私有变量值都不会被销毁。这时候的变量会被 保存起来。
- 综合上面的内容:在函数执行时,形成的上下文,起到保存 和 保护 私有变量的机制。我们称之为 “闭包”。
示例
let x = 5;
function fn(x) {
return function(y) {
console.log(y+(++x));
}
}
let f = fn(6);
f(7);
fn(8)(9);
f(10);
console.log(x);
- 该题中可以看出:
-
- 在js 执行前,会先变量提升。此时的fn-> AAAFFF00 提前。然后从上到小执行,在VO中存储变量对象。
-
- f = fn(6); fn执行,返回一个新函数,属于新内存地址。这时候f保存了新的内存BBBFFF000.其原地址无法无法进行释放。所以一直在栈内存中进行存储。
-
- fn(8)(9): 按照从左往右的顺序,先执行fn,其返回值,跟着再执行。
-
- 小知识点:
i++ 会拿原始值进行运算,完成后拿自身+1;无论该自加有没有使用 括号包裹。
let i=5; 10+(i++) === 15; i === 16
++i 优先累加1.在拿到累加后的结果在进行其余运算
10+(++i) === 16
