// 内存泄露示例: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
-
foo()函数- 定义了两个局部变量
name和age。 - 内部声明了一个函数
bar()(闭包),引用了外部的name和age。 - 最后返回了
bar函数。
- 定义了两个局部变量
-
闭包的作用
- 调用
foo()后,其局部变量name和age本应被销毁,但由于返回的bar函数引用了它们,这些变量会被保留在内存中(闭包特性)。 - 执行
fn()(即bar())时,仍能正确访问name和age。
- 调用
-
内存泄露风险
- 如果
fn长期存在(例如作为全局变量),则name和age会一直占用内存,无法被垃圾回收,导致内存泄露。
- 如果
在内存中的表现:
因为没有使用age变量,所以在实机开发过程中,不会创建age的内存,js引擎会将age删掉
判断有没有age的方法: 使用debugger来判断
function foo() {
var name = "why"
var age = 18
function bar() {
debugger
console.log(name)
}
return bar
}
var fn = foo()
fn()
如果存在
console.log(age)打印的结果age为18