gpt4 book ai didi

javascript - 闭包中的值会发生什么? JavaScript

转载 作者:行者123 更新时间:2023-11-28 18:47:52 26 4
gpt4 key购买 nike

我看到了really cool explanation of closure.所以在我看来,闭包是一种将数据存储在某处的方法。让我们看看闭包的例子和不闭包的例子:

不关闭:

function F1(x,y)
{
var z=5;
function F2(){
console.log('x='+x+'y='+y+'z='+z);
}
F2();
}

F1(1,2)

关闭:

function F1(x,y)
{
var z=5;
function F2(){
console.log('x='+x+'y='+y+'z='+z);
}
return F2();
}

var p=F1(1,2)
p();

我了解到,在闭包中,当 F1() 完成其工作时,F1() 会清除与保存 F1 值的存储的连接。但 F2() 仍然保留对值存储的引用。

让我们看一下图像:

不关闭: enter image description here

关闭: enter image description here

我想知道内存中发生了什么。我对 C# 知之甚少,引用类型是在堆中为每个引用类型创建对象的原因。 我的问题是,如果 F1() 的值已被垃圾回收,如何存储 F2() 的值?

我的意思是内存中发生了什么 - 创建了多少个对象?(JavaScript 像 C# 一样在堆上创建对象?)或者 JavaScript 可能只是使用堆栈来存储函数的值?

最佳答案

每次调用函数时,都会生成一个新的 activation context containing the local variables被 build 。如果内部函数使用任何这些变量,则会保存激活上下文(在闭包中),以便可以在该函数外部访问局部变量。

每个激活上下文(函数调用)仅创建一个闭包。也就是说,

// One closure is created every time you call doSomething
// The loop in doSomething creates a single closure that is shared
// by all the divs handlers (or all the handlers point to the same function
// instance and its closure)
function doSomething(divs) {
for (var i =0; i < divs.length; i++) {
div.onclick = function() {
// Because there is only one closure, i will be the same
// for all divs
console.log('Clicked div, i is' + i);
}
}
}

// One closure here
doSomething([div1,div2,div3]);
// One closure here
doSomething([div9,div10, div11]);

垃圾收集器永远不会对仍然引用它的闭包进行垃圾收集。顺便说一句,这是内存泄漏的根源之一。闭包和 DOM 元素之间经常存在循环引用,这使得 IE 无法垃圾收集该闭包,因为它无法检测 DOM 元素和常规 JavaScript 对象之间的循环引用。

关于javascript - 闭包中的值会发生什么? JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com