■ Operaのarguments
数日風邪で寝ていまして、しばらくJavaScriptのことしか考えてなかったので他に書くことがありません。
(修論の締め切りも近づいてまいりました。風邪は治ったのでもう締め切りまでJavaScriptには触りません)
以下、驚いたこと。
JavaScriptには関数内でのみ参照できるargumentsという変数がある。噂によればargumentsは「配列のようなもの」であって配列ではないらしい。
var args;
var fn = function(){
args = arguments;
};
fn(0,1,2);
以上のように書くと関数の外側からargumentsを参照できるようになる。
で、Operaの場合。
>> args 0,1,2 >> typeof args object >> args instanceof Array true
配列だと主張する(他のブラウザだとfalse)。
>> args.pop() 2 >> args 0,1 >> args.push(3) 3 >> args 0,1,3
popとpushが動く(他のブラウザだと動かない)。
shiftを動かしてみる。
>> args.shift(); 0 >> args ,1 >> args.length 2 >> args[2] null >> args[1] 1 >> args[0] null
なぜか配列末尾までなくなった!
気をとりなおしてunshift。
>> args 0,1,2 >> args.unshift(3); 4 >> args 3,1,2, >> args.length 4
配列の頭がどっかいった!
何これ。こいつのせいで大変無駄な時間を......。
■ Link
[追記]HTMLエレメントと自作オブジェクトの間に循環参照があるとIEがメモリリークを起こすそうです。
ので下の記事のようなことをするのはやめた方がいいようです。[/追記]
ページ内にあるHTML要素だってJavaScriptから見ればオブジェクトなわけじゃないか。
で、オブジェクトであるということはエレメントに対する書き込みもできるわけなんだ。
そしてだな、今仮にA要素(<a href...>のことな)を見て、リンク先のページをJavaScriptでロードするような或る物をつくってるとするじゃないか。その場合読み込んだページをどこかにキャッシュできるようにしておくとありがたいわけだが、問題はどこにキャッシュするかだ。で、その選択肢の1つとして、リンクそのものにデータをキャッシュさせるというのもありなんじゃないかと思うんだ。
これはつまり「自分のリンク先の内容くらい自分で覚えておけ」という形で自己責任を追求する立場と考えることもできる。あと、これをやると結構綺麗に処理が書ける。
たとえばリンクをクリックすると、ハンドラが呼び出される。ハンドラはイベントのターゲットであるA要素に対し、キャッシュがあるかどうかを問い合わせる。もしキャッシュがあればそれを表示し、なければ新たにロードする。
というのはなかなか美しい流れなんじゃないかと思うのだが、ページ内のHTML要素に対してそんな大規模な書き込みをしてもいいのかな?というのが微妙に不安だった。だからリンクそのものではなくリンクに対するラッパーをつくっておいて、キャッシュはラッパーに持たせ、リンクにはラッパーへの参照だけを書き込むということにした。
今いちその辺の微妙なノウハウがわからないのだが、そういうことしてもいいのかな? どうなんだろう?
あとFunctionとかArrayのprototypeに関数を追加するのはどうなんだろう。firebugで見たときに追加した関数がぞろぞろ表示されたりして何となく気持ち悪いと思わないでもないが、えらい人も(prototype.jsとかLDRとか)やってるし、よく考えたら別にいいのかな。しばらくの間勝手に禁じ手にしてたのだがやっぱり開放することにしようか。
余談だが、Array.prototype.eachを追加する件について以前書いたが、prototype.js風じゃなくてjquery風の以下の方が素敵だと思った。
Array.prototype.each = function(itr){
for(var i=0,l=this.length;i<l;i++)
itr.apply(this[i])
}
これだと以下のように書ける。
[1,2,3].each(function(){
alert(this);
});
コメント(2)
コメントする
トラックバック(0)
このブログ記事を参照しているブログ一覧: 雑記2007年12月3日(月)
このブログ記事に対するトラックバックURL: http://www.at-akada.org/mt/mt-tb.cgi/855
ObLwyg
』 (2009/07/14 9:58)ObLwyg
』 (2009/07/14 9:59)