Diary?

2008-01-12
Sat

(01:02)

昨日の仕事は実に酷い内容だった。何をやっていたのかというと、 form に対して動的に input 要素を追加する JavaScript を書いていたのだが、よりによってそれをJSP タグライブラリの中で書くというよくわからんことになっていた。しかもそんなことをしなければならなかった理由が、セッション情報に持たせるためのキーがないので毎回リクエストに入れ込んで持ち回すしかなかったというのだから呆れてしまう。どう考えても設計ミスだろ (前のプロジェクトの設計を何も考えずにコピペしてるからそうなる)。業務処理には無関係で単にユーザビリティというか画面の見栄えに関わるだけなので全体に修正をかけるわけにもいかず、だったらプロジェクトチーム随一の黒魔術師に泥を食ってもらおうということになったわけだ。ふざけんな。

それで久しぶりに JavaScript を書いたのだけど、俺はやっぱこの言語嫌いだ。とりあえず以下のソースコードを見てくれ。

function fun1() {
  for (i = 0; i < 10; i++) {
    print(i);
  }
}
 
function fun2() {
  for (i = 0; i < 10; i++) {
    fun1();
  }
}
 
fun2();

実行結果がどうなるかわかる? 「0 ..9 が 10 回画面に出力される」と答えた人は大変な常識人だと思うが、残念ながら JavaScript の世界では間違いのようだ。こいつを実行すると、単に 0 .. 9 が 1 回だけ出力される。え? 言ってることがわからない? じゃあとりあえず、先に書いたとおりの動作をするコードを書いてみよう。

function fun1() {
  for (var i = 0; i < 10; i++) {
    print(i);
  }
}
 
function fun2() {
  for (var i = 0; i < 10; i++) {
    fun1();
  }
}
 
fun2();

何が変わったかわかるか? そう、 var を付けただけだ。このあたりの話は檜山さんの「プログラマのためのJavaScript (12):不思議な宣言と奇妙なスコープ」が参考になるのだけど、どうも JavaScript にはブロックスコープが存在しないのだという。いや、それだけなら別にいい。例えば Python だって、変数のスコープはブロックではなく関数、クラス、ファイルといった単位になっている。だからブロックスコープでないというだけなら俺は何も文句は言わない (いや、本当は Python の変数のスコープにも文句はあるけど、まだ目を瞑ってもいいというレベルってこと)。問題は、 var を付けないと大域変数になってしまうということだ。つまり、最初に出したコードは次のコードのようなものだ (完全に同じじゃない。最初のコードだと i というシンボルが未定義)。

var i;
function fun1() {
  for (i = 0; i < 10; i++) {
    print(i);
  }
}
 
function fun2() {
  for (i = 0; i < 10; i++) {
    fun1();
  }
}
 
fun2();

俺が何にむかついているかというと、デフォルトで大域変数になるという仕様だ。しかも JavaScript にはパッケージだのモジュールだのといった概念がなく (俺はこれが最高に嫌いだ)、大域変数のやらかす悪さは輪をかけて大変なものとなる。確かに毎度毎度 var を付けていれば問題は起こらないだろうけど、じゃあそれって誰が保証すんの? 出来ないでしょ、そんなの。プログラミング言語の良し悪しを客観的に判断するまともなやり方の一つに、デフォルトがクソかどうかというのがある。クソなデフォルトはポカをしたときに事態をややこしくする (use strict していない Perl を考えてみよう)。そして、 JavaScript は現状では明らかにクソだ。

ところで JavaScript 2.0 ではこういった問題が修正されるらしく (どうやらパッケージ機能も追加されるらしい。というか、かなり Python ライクな部分もある)、これでようやくまともな言語になるなと思ってはいるのだけど、互換性とかの運用面を考えると相当な期間は現状のふざけた仕様に付き合う他なさそうだ。主要な Web ブラウザ全てが対応して、そういったブラウザのシェアが大多数を占めるようになって、それでようやく大手を振って使えるようになるわけだ。気が遠くなるね。

何せ Fierfox は 3.0 以降の対応で (一時期はすると言ってたけど未定に戻ったんだよな?)、 IE については……。少し調べた限りでは IE って JavaScript 1.3 までしか対応してないんだよな。どうも JavaScript 1.7 以降のリストの内包とかジェネレータとかの機能の話をあんまり聞かないなと思ったら、そういうことか。とにかく Web 開発はまず間違いなくクロス開発になるわけで、そうなると一番後進的な奴に全体を合わせる必要がある。つまり、 IE が対応するか IE のシェアが全体から見れば誤差程度に落ち込むまでは、 JavaScript 1.3 以降の機能は単なる技術マニアがお遊びで弄ってニヤニヤする程度のものにしかならんのだよ。だから俺は Microsoft も Web 開発も嫌いなんだよ。

追記: IE が対応してんのは JavaScript 1.5 (互換の JScript 5.6) だった。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。