如何解决“ arguments”对象会阻止未绑定参数的垃圾回收吗?
如果我有一个函数“ sum
”,该函数“接受”两个参数,则返回一个将在“很长的时间内”解决的承诺。传递给sum
的任何参数(过去两个参数)会保留在内存中,并防止被垃圾回收吗?
例如,sum
会阻止“大对象” FOO被垃圾收集吗?
const sum = (a,b) => new Promise((resolve) => {
setTimeout(() => resolve(a+b),500 /* Lets pretend this is a huge number */);
});
(async () => {
const s = await sum(2,3,{/* Some large object,FOO */});
console.log(s);
})();
我假设因为您可以通过“参数”对象访问FOO,那么FOO是否需要保存在内存中?但是,由于箭头函数无法访问“参数”,因此关键字函数和箭头函数之间的行为是否会有所不同?
function sum(a,b) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(...arguments);
resolve(a+b);
},500 /* Lets pretend this is a huge number */);
});
};
const arrowSum = (a,b) => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(...arguments);
resolve(a+b);
},500 /* Lets pretend this is a huge number */);
});
};
(async () => {
const s = await sum(2,FOO */});
console.log(s);
const arrowS = await arrowSum(2,FOO */});
console.log(arrowS);
})();
解决方法
来自twitter thread with Surma(一位Google工程师)。
问::“ arguments”对象会阻止未绑定参数的垃圾回收吗?
A:是的。您可以通过eval()访问arguments
,因此引擎/编译器无法证明您不会访问它并放开对象。
问:由于“参数”在箭头功能中不起作用,因此这会使箭头功能更有效,因为消费者的滥用不会导致性能下降。关键字功能可以吗?
A:从理论上讲,我认为箭头函数在此具有普通函数没有的优化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。