Skip to content

Instantly share code, notes, and snippets.

@Constellation
Created August 11, 2011 14:47
Show Gist options
  • Save Constellation/1139846 to your computer and use it in GitHub Desktop.
Save Constellation/1139846 to your computer and use it in GitHub Desktop.
function test(a, b, c) {
// ここまでは当然
console.assert(a === 1);
console.assert(b === 2);
console.assert(c === 3);
console.assert(arguments[0] === 1);
console.assert(arguments[1] === 2);
console.assert(arguments[2] === 3);
// ここから環境連携の力が
a = 4;
console.assert(a === 4);
console.assert(arguments[0] === 4); // !!
arguments[1] = 5;
console.assert(arguments[1] === 5);
console.assert(b === 5); // !!
}
test(1, 2, 3);
// というわけで, 実際にはargumentsは環境のhash tableを保持していて, 0などでaccessされるとその辞書をいちいちlookupします.
// http://es5.github.com/#x10.6
// の[[GetOwnProperty]]を見てもらえればロクでもないobjectなのがわかります.
// Brendan Eichさんも, argumentsはひどいと思っているので, 将来的には削除されるかもしれません.(現にstrict modeでは環境連携機能は消されました)
// http://brendaneich.com/2011/01/harmony-of-my-dreams/
//
// 擬似的な実装をすれば, ES5仕様では, 以下のような実装になっていることになっています.
function test2(a, b) {
// ここから本来はないのですが, 擬似的なarguments構築の過程を
var MyArguments = {
get "0"() {
return a;
},
set "0"(val) {
return a = val;
},
get "1"() {
return b;
},
set "1"(val) {
return b = val;
},
length: 2
};
// まあこんなのが来ると思ってください... 遅いです.
// また, argumentsというSymbolがきた時点で環境が必要になるので,
// 引数がstackに乗らなくなるなどVM bytecode的にロクでもないので,
// なるべく使わないときはargumentsというsymbolを使うのすら避けるのをお勧めします.
// (strict modeは別, 環境連携しないので)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment