闭包引用的AO对象属性销毁

41 阅读1分钟
// 内存泄露示例:JS 闭包引用的自由变量未被销毁
function foo() {
    var name = "why"      // 局部变量 name
    var age = 18          // 局部变量 age

    function bar() {      // 内部函数(闭包)
        console.log(name) // 引用外部函数的 name
        console.log(age)  // 引用外部函数的 age
    }

    return bar            // 返回闭包函数
}

var fn = foo()  // 执行 foo,返回 bar 函数并赋值给 fn
fn()            // 调用 bar,输出 "why" 和 18
  1. foo() 函数

    • 定义了两个局部变量 name 和 age
    • 内部声明了一个函数 bar()(闭包),引用了外部的 name 和 age
    • 最后返回了 bar 函数。
  2. 闭包的作用

    • 调用 foo() 后,其局部变量 name 和 age 本应被销毁,但由于返回的 bar 函数引用了它们,这些变量会被保留在内存中(闭包特性)。
    • 执行 fn()(即 bar())时,仍能正确访问 name 和 age
  3. 内存泄露风险

    • 如果 fn 长期存在(例如作为全局变量),则 name 和 age 会一直占用内存,无法被垃圾回收,导致内存泄露。

在内存中的表现:

image.png

image.png

因为没有使用age变量,所以在实机开发过程中,不会创建age的内存,js引擎会将age删掉 image.png

判断有没有age的方法: 使用debugger来判断

function foo() {
    var name = "why"      
    var age = 18         

    function bar() {     
        debugger
        console.log(name)  
    }

    return bar            
}

var fn = foo()  
fn() 

image.png 如果存在console.log(age)打印的结果age为18