このずさんなモードの関数があったと仮定すると、(何らかの奇妙な理由で) そのarguments
オブジェクトが呼び出し元に返されます。
function example(a, b/* ...*/) {
var c = // some processing
return arguments;
}
呼び出し ( ) の結果を格納すると、( 、などを含むvar d=example();
) の変数環境がガベージ コレクションされるのを防ぐことができますか? Arguments オブジェクトの内部セッターとゲッターは、クロージャーから返された関数と同じように、引き続きそれを参照する可能性があります。デモ:example
a
b
c
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
にガベージコレクションされ、リークされないことを期待しますが、どうですか? オブジェクトのプロパティを取得するとどうなりますか?b
delete
arguments