JavaScriptのthisの挙動について
JavaScriptで次のCodeのようなコードを書いて実行したところ、Outputのようになります。
原因は、thisが保持できていなかったからです。
※先頭に#が付いているのが問題の箇所です。
Code:
Array.prototype.rs = function() // rs = random sort
{
var ret = {
list: new Array(),
length: new Number()
};
# var obj = {
# list: this
# };
var tmp = {
index: new Number(),
length: obj.list.length
};
while((ret.length = ret.list.length) < tmp.length)
{
tmp.index = Math.floor(Math.random() * (tmp.length - ret.length));
ret.list[ret.length] = obj.list[tmp.index];
obj.list.splice(tmp.index, 1);
}
return ret.list;
}
var list = new Array(1,2,3,4,5,6,7,8,9);
alert(list.rs());
alert(list.rs());
Output:
アラートウィンドウで 2,4,6,9,3,5,1,8,7 (一例)
アラートウィンドウで 出力無し
要するに、thisをobj.listに入れて、thisには触っていないのに、obj.listと同期してthisが消えているのです。
Code中で先頭に#を付けた部分を次のように変更すると期待通りに動作しましたが、腑に落ちません。
# var obj = {
# num: this.join('')
# };
# obj.list = obj.num.split('');
もっと簡潔な書き方や、迅速に動く書き方があればご教授頂きたいです。
お礼
ご回答ありがとうございます。 私は、まさに「能力がない」の代名詞です。 ありがとうございました。