gpt4 book ai didi

javascript - Javascript 中的绑定(bind)函数会导致内存泄漏吗?

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

我认为这段代码可能会导致内存泄漏:

function foo(arr, value){
arr.push(value);
console.log(arr);
}
var bar = foo.bind(null, []);
bar('first call');//output: ['first call']

//The next thing that confused me is happened,
//'first call' has been hold in 'arr' after bar('first call') execute:

bar('second call');//output: ['first call', 'second call'];

我在想为什么第一个函数执行完后GC不是第一个函数参数引用的集合?

本以为bar函数每次执行时,形参arr应该初始化为[]

还有arr/[]和下面的变量arr2有什么区别?

var arr2 = [];
function foo2(value){
arr2.push(value);
console.log(arr2);
}
var bar2 = foo2.bind(null);
bar2('first call 2');
bar2('second call 2');

提前致谢!

最佳答案

您不是将第一个参数绑定(bind)到新数组的概念,而是绑定(bind)到您创建并初始化为新数组的特定对象。更准确地说,JavaScript 中的变量是对象的标签/指针。许多标签可以引用同一个对象,当底层对象被修改时,每个标签“看到变化”。原始类型和不可变类型(字符串、日期等)除外,不允许就地修改。

下面的代码是等价的:

var baz = []; // or baz = new Array();
var bar = foo.bind(null, baz); // bind first argument to object pointed to by baz.
bar('first call'); // operates on baz, making it ['first call']
bar('second call'); // operates on baz, making it ['first call', 'second call']
baz.push('x'); // ['first call', 'second call', 'x'];

此外,在回答您的问题时,这是标准行为。在具有相似语义的所有其他编程语言(Python、Ruby、C#、Java 等)中,它或多或少是相同的。因此,只有当 foo2 永远存在时才会发生内存泄漏,但您希望它只存在一小会儿。

关于javascript - Javascript 中的绑定(bind)函数会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442193/

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