gpt4 book ai didi

javascript - 如果我从不调用回调,JavaScript 会发生什么?

转载 作者:搜寻专家 更新时间:2023-11-01 05:02:09 25 4
gpt4 key购买 nike

假设我有以下代码

function myFunction(param, callback) {
...
if (err) {
console.log("error");
console.log(err);
}
else {
callback(data);
}
}

在没有错误的情况下,调用回调。在错误的情况下,它不是。假设调用函数如下所示

myFunction(param, function(data) {
...
});

是否存在内存泄漏问题或类似问题?有没有更好的方法来处理这种情况?

最佳答案

一个 JavaScript 对象只要不符合回收条件,因为它是强可达的:也就是说,如果它可以通过从根对象遍历对象图(基本上等于全局属性或可能是封闭的变量)。任何不再强可达的对象都不再可以通过 JavaScript 访问,并且将由 GC 回收(当 GC 需要时)。

在这种情况下,传递给 myFunction 的函数对象(回调)在函数调用期间可以通过 访问时是强可达的>回调参数*。因为函数对象在函数之后不是强可达的(例如,它没有保存到全局属性),所以函数对象有资格回收 - 以及它引用的任何函数范围,如果它们不再是强可达的- 一旦函数终止。

因此在这种情况下,不存在“内存泄漏”。但是,想象一下这种情况:

window.myCallbacks = []
function myFunction(param, callback) {
...
window.myCallbacks.push(callback) // hmm, maybe always strongly-reachable?
}

快乐编码。


从技术上讲,真正智能的 JavaScript 引擎可以确定由 callback 命名的对象在“if”分支中不再是强可达的(通过 callback)。我不确定是否有任何 JS 引擎真的走到了这一步,但是当谈论闭包中绑定(bind)的函数作用域时,这个问题变得更加有趣(如果这保留了所有变量命名的所有对象,即使是那些以后没有访问的对象,强烈-可达)。

关于javascript - 如果我从不调用回调,JavaScript 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899687/

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