Search K
Appearance
👍欢迎大家积极投稿交流👍
如果文档内容陈旧或者链接失效,请发现后及时同步,我将尽快修改
👇微信👇

Appearance
闭包是指那些能够访问自由变量(在函数中使用的,但既不是函数参数也不是函数的局部变量的变量)的函数。
使创建它的上下文已经销毁,它仍然存在,在代码中引用了自由变量 垃圾回收机制没有把当前变量和参数回收掉,这样的操作带来了内存泄漏的影响
通常就是通过闭包间接访问函数内部的变量,也就是说闭包就是能够读取其它函数内部变量的函数
function A() {
let a = 1
windos.B = function () {
console.log(a)
}
}
A()
B() // 1function a() {
let i = 0
return function b() {
console.log(++i)
}
}
let fn = a()
fn() // 1
fn() // 2
fn() // 3需要重用一个变量,又要保护变量不会被污染
内存泄露
指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
// 本意输出1 2 3 4 5
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}
// 错误输出 6 6 6 6 6for (var i = 1; i <= 5; i++) {
;(function (j) {
setTimeout(function timer() {
console.log(j)
}, j * 1000)
})(i)
}for (var i = 1; i <= 5; i++) {
function b(j) {
setTimeout(function timer() {
console.log(j)
}, j * 1000)
}
b(i)
}for (var i = 1; i <= 5; i++) {
setTimeout(
function timer(j) {
console.log(j)
},
i * 1000,
i,
)
}for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}var data = []
for (var i = 0; i < 3; i++) {
data[i] = function () {
console.log(i)
}
}
data[0]() // 3
data[1]() // 3
data[2]() // 3data[0] 时globalContext = {
VO:{
data:[...],
i:3
}
}data[0]data[0]Context = {
AO:{
arguments:{
length:0
}
},
Scope:[AO,globalContext.VO]
}data[0]的AO中没有i,所以从 globalContext.VO 中去查找data[1],data[2] 同理使用匿名函数包裹形成闭包
var data = []
for (var i = 0; i < 3; i++) {
data[i] = (function (i) {
return function () {
console.log(i)
}
})(i)
}
data[0]() // 0
data[1]() // 1
data[2]() // 2data[0]时globalContext = {
VO:{
data:[...],
i:3
}
}data[0]时data[0]Context = {
AO:{
arguments:{
length:0
}
},
Scope:[AO,匿名函数Context.AO,globalContext.VO]
}
匿名函数Context= {
AO:{
arguments:{
0:0,
length:1
},
i:0
}
}data[0]沿着作用域链找到了匿名函数Context.AO上的i,此时就不会再继续查找了data[1],data[2] 同理