js -- 闭包机制

46 阅读2分钟
  • 亲们,首先闭包是一种机制,一种机制,一种机制。
  • 我们知道,在函数执行时候,会形成一个全新的私有上下文,这个上下文会进栈进行执行。在执行完毕后,正常来说,是要出栈进行释放的,但是有时候上层上下文会引用该私有上下文的内容,比如私有变量、私有方法等,导致其不能销毁内存,无法释放。这就说闭包。
  • 其实从本质来说,函数执行的时候,形成的私有上下文,内部存储的变量方法等,都是在私有空间中,所以起到了 保护的作用。
  • 当上下文不会被销毁的时候,所存储的私有变量值都不会被销毁。这时候的变量会被 保存起来。
  • 综合上面的内容:在函数执行时,形成的上下文,起到保存 和 保护 私有变量的机制。我们称之为 “闭包”。

示例

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);
  • 该题中可以看出:
    1. 在js 执行前,会先变量提升。此时的fn-> AAAFFF00 提前。然后从上到小执行,在VO中存储变量对象。
    1. f = fn(6); fn执行,返回一个新函数,属于新内存地址。这时候f保存了新的内存BBBFFF000.其原地址无法无法进行释放。所以一直在栈内存中进行存储。
    1. fn(8)(9): 按照从左往右的顺序,先执行fn,其返回值,跟着再执行。
    1. 小知识点:
    • i++ 会拿原始值进行运算,完成后拿自身+1;无论该自加有没有使用 括号包裹。 let i=5; 10+(i++) === 15; i === 16
    • ++i 优先累加1.在拿到累加后的结果在进行其余运算 10+(++i) === 16

004.002.shiti.png