gpt4 book ai didi

javascript - Arguments 对象是否泄漏?

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:24 26 4
gpt4 key购买 nike

假设我有这个草率模式函数,它(出于某种奇怪的原因)将其 arguments 对象返回给调用者:

function example(a, b/* ...*/) {
var c = // some processing
return arguments;
}

存储调用结果 (var d=example();) 会阻止 example 的变量环境(包含 abc 等)免于被垃圾回收? Arguments object 的内部 setter 和 getter可能仍然引用它,就像从闭包返回的函数一样。演示:

function example(a, b) {
var c = Array(1000).fill(0); // some large object
return {
args: arguments,
set: function(x) { a = x; },
get: function() { return a; }
};
}
var d = example('init');
console.log(d.get());
d.args[0] = 'arguments update'; // assigns the `a` variable
console.log(d.get());
d.set('variable update');
console.log(d.args); // reads the `a` variable

我知道几乎没有用例(传递 Arguments 对象被认为是不好的做法,很可能是因为它们与数组相似),但这更多是一个理论问题。不同的 EcmaScript 实现如何处理这个问题?它的实现是否接近规范?

我希望 c 被垃圾回收 like with a normal closure并且不会被泄露,但是 b 呢?如果我删除 arguments 对象的属性会发生什么情况?

最佳答案

考虑一下:

var x = function() {
return arguments;
}
console.log( x() === x() );

它是错误的,因为它不是同一个 arguments 对象:它是(对于 x 的每次调用)一个具有 存储在其中的所有参数。然而它具有 arguments 的属性:

var y = x([]);
console.log(y instanceof Object); // true
console.log(y instanceof Array); // false
console.log(y.length); // 1
console.log(y.callee + ''); // function() { return arguments; }

然而,还有更多。显然,如果返回 arguments,作为参数发送到函数中的对象将不会被 GC 收集:

var z = x({some: 'value'});
console.log(z[0]); // {some:'value'}

这是预料之中的:毕竟,您可以通过在函数内声明一些局部对象,将函数的第一个参数的值分配为其对象“0”属性,然后返回该对象来获得类似的结果。在这两种情况下,引用的对象仍将“在使用中”,所以我想没什么大不了的。

但是这个呢?

var globalArgs;
var returnArguments = function() {
var localArgs = arguments;
console.log('Local arguments: ');
console.log(localArgs.callee.arguments);
if (globalArgs) { // not the first run
console.log('Global arguments inside function: ');
console.log(globalArgs.callee.arguments);
}
return arguments;
}
globalArgs = returnArguments('foo');
console.log('Global arguments outside function #1: ');
console.log(globalArgs.callee.arguments);
globalArgs = returnArguments('bar');
console.log('Global arguments outside function #2: ');
console.log(globalArgs.callee.arguments);

输出:

Local arguments: ["foo"]
Global arguments outside function #1: null
Local arguments: ["bar"]
Global arguments inside function: ["bar"]
Global arguments outside function #2: null

如您所见,如果您返回 arguments 对象并将其分配给某个变量,则在函数内部,其 callee.argument 属性指向与 参数本身;再次,这是预期的。但在函数外 variable.callee.arguments 等于 null(不是 undefined)。

关于javascript - Arguments 对象是否泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13515977/

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