for文と局所変数についてのメモ
A re-introduction to JavaScript を読む。はてブでは 4 ユーザしかブックマークしていないけれど,もっと評価されても良いと思う。日本語版は力つきて途中で終わっているけれど,暇があったら翻訳を手伝ってもいいかなと思う。
JavaScriptの勉強=バッドノウハウの勉強,というイメージが未だに私の中にあって,それが今まで手をつけてこなかった理由でもある。これもバッドノウハウの一部かも知れないけれど。
配列を for 文で回すとき for (var i = 0; i < a.length; ++i) と書くのは遅い
これは VisualBasic など,インタプリタチック言語ではよく言われる話。ループの度に length という名のハッシュ要素へアクセスするため,効率的ではない。C++みたいに都合良く最適化されないので注意が必要。より良いのは
var a = [...]; for (var i, len = a.length; i < len; ++i) { : }
あるいは
var a = [...]; for (var i, elem; elem = a[i]; ++i) { : }
と書くこと。…なんだけど,こういう知識を積み重ねるたびに,所詮スクリプトプログラマは釈迦の手のひらで遊ぶ孫悟空のごとしであることを,ついつい感じて落ち込んでしまう(孫悟空になれて幸せ,と思う方が正しいのかも)。
ブロックスコープを実現するためのイディオム
檜山正幸のキマイラ飼育記 - プログラマのためのJavaScript (12):不思議な宣言と奇妙なスコープ にとても詳しく解説されているとおり,JavaScript には今のところ,ブロックスコープという概念がない。そこで,以下のように
(function() { var b = 0; var c = 0; : // do something a = b + c; })();
無名関数を使ってローカルスコープを実現するという策がとられる。この辺は etolisp の経験からすんなりと思いつく。さらに,念のため google してみたところ,以下のような書き方もあることが分かった。こちらは with という構文を使っても実現する。こちらの方がマイナーな気がするけど,少し綺麗になる(Days on the Moon - JavaScript でブロックスコープを実現する)。
with ({ b:0, c:0 }) { : // do something a = b + c; }
ただ,将来的にはこのうんこみたいな特殊なスコープの仕様は改良されると思われるので,必要がない限りは,通常の C や Java のスコープルールの「つもり」でコードを書くのが良いのではないだろうか。
その他:参考
- IT戦記 - JavaScript のスコープに変数を動的に追加する(マニアックなことをしている)