Created
August 11, 2011 14:47
-
-
Save Constellation/1139846 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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