JavaScript > Kanasan.JS JavaScript第5版読書会#2に行ってきました。

2008年01月15日

Kanasan.JS JavaScript第5版読書会#2 に参加して来ました。 前回のコードリーディング同様、かなり内容が濃かったです。id:amachangの参加をdel.icio.usで経由で知ったり、参加者がとても増えたので、急遽会場の変更等ありましたが、無事終えることができました。

今回僕は運営スタッフとしても参加させて頂いていて、当日の進行や段取り等、反省するべき点も色々とありましたが、皆様のおかげでとても良い勉強会になったと思います。ありがとうございました。

運営に手一杯で、正直、あまり集中して読書が出来なかったのですが、理解出来た範囲でまとめたいと思います。

ライトニングトーク

受付しながらだった事と、午後の準備等で、集中して見れていなかったのですが、 amachangによる、JavaScriptで非同期処理を行う為の「JSDeffered」が印象的でした。これは凄かった。

今回の資料とは異なりますが、以下が詳しいです。

JSDeferred による非同期処理

今回の読書会では制御文と関数、オブジェクトの項目を読みました。以降は気になった所を走り書きしてみます。

switch文

忘れられがちな気がするswitch文。JavaScriptではあまり使った事がないのですが、見ている限りは大体PHPと同じ感覚で動作しそうです。

注意点

case は==ではなく===を使って比較されます。
という事らしいです。
case : n+1;
case a[0];
という表記も可能。PHPの場合は、確か関数も入れる事が出来たと思います。

do/while文

こちらも忘れがち。一回処理を行ってからループするかどうかを判断するのは割とよくあると思いますが、do/whileの存在を忘れている事が多いです。

ラベル文、break、continue

これは始めて知りました。以下はサンプルコードです

parser : 
    while(token){
    //処理内容
        for(var i; i<10; i++;){
            //処理内容
			break parser;
        }
} 

というコードがあった場合、parserがラベルに当たります。

通常のbreak文なら、「for」が終わるだけですが、「break parser」とすると、「while」自体を終了させる事が出来ます。

PHPでもbreak 1;とかで、breakを行うループを指定出来るので理解がしやすかったです。ラベルを指定出来るのは素敵です。

continueも同様にラベルを指定する事で、任意のループに対して、continueを実行出来ます。

これで入れ子になった配列の操作が行いやすくなります。

with文

with文はJavaScriptを理解する上で、必要な文だと思っているのですが、今回はあまり話題になりませんでした。

簡単に説明すると、変数のスコープを変更します。但し、処理が重い事から、あまり使われていません。

より安全な関数定義の方法

問題

まずはサンプルコードとコード内のコメントをご覧下さい。

//ここでは関数fはまだ定義されていない。
//問い1:定義されていない関数fを呼び出して、何が表示されるか?
alert(f(4));
//ここでfは関数としてではなく、変数として定義される。
var f = 0;
//既に定義されている変数fと同名の関数fがここで定義される。
function f(x) {
    return x * x;
}
//問い2:変数fの後に関数として、fが定義されているが、ここでは何が表示されるか?
alert(f);

結果

問い1はまだ定義されていないにも関わらず、関数fが呼び出せる

問い2は、変数として「0」が表示される。

どうしてか?

これは、ソースコードをコンパイルされて実行される手順を見ると分かります。

  1. まずは、一度全てのソースをパースする。この時に定義された関数を抜き出す。
  2. この時点でfは関数として定義されています。
  3. 次に一行ずつインタプリンタがソースをパースして、実行していく。
  4. 問い1の段階では、fは一度目のパースで関数としてパースされているので、普通に関数として実行出来る
  5. 次にインタプリンタが「var f」を見つけた時点で、「f」は変数として、上書きされる。
  6. インタプリンタが「function f」を見つける。しかし、functionは最初のパースで探しているので、二回目はパスされる。
  7. 結果として、「function f」は無視されるので、問い2は変数として表示される

という手順のようです。もし、これが実際に起こってバグが出た場合、発見するのはとても困難です。
そこで関数定義は以下のようにするのがより安全です。

解決策

  • 名前空間を出来るだけ限定する。プログラムを書く上で基本ですが、変数名や関数名が重複しないよう(JAVAとかは別だと思いますが)に、名前空間(スコープと言った方がいいかな?)を限定する。
  • function f(){}ではなく、var f = function(){}と定義する。JavaScriptは関数もオブジェクトなので、上記のような書き方ができます。これだと、インタプリンタが発見した段階で、定義されるので、挙動を読み易い

その他

式と文の違いや、プロトタイプベースとクラスベースの違い等、概念的な議論が多かったように思います。

式と文の違いや、 Abstract Syntax Tree(抽象構文木)当たりのくだりは全然理解出来なかったのですが、 JavaScriptに限って、プロトタイプとクラスの概念的な違いなら、少しは書けるかも知れないです。
まとまった時間が取れれば考えてみようと思います。

懇親会とか感想とか

箇条書きしてみます

  • みなさん色々と手伝って頂いて、本当に助かりました。
  • id:shogo4405さんが受付を手伝ってくれました。ありがとうございます!
  • id:amachnagとはほとんど話せなかった、残念。東京からありがとうございました!
  • id:higeorangeに会えた。やっぱり髭だった
  • yukkyさんありがとうございました!
  • 今回、女性のプログラマーの方もいらっしゃいました
  • Jashtureのデモを行う際にUbuntuをさりげなくアピールしようとしたものの、急にネットワークに繋がらなくなり、デュアルディスプレイも失敗。 「質問ありますか?」「そのOSはなんですか?」「Ubuntuです」という流れを想定していたのは秘密。

勉強会、懇親会共にとても楽しかったです。ありがとうございました!次回も宜しくお願いします。

posted by 37to at : 00:03 | コメント (0) | トラックバック (0)

コメント

この記事に対するコメントはまだありません。


投稿する

投稿者情報を保存しますか?


トラックバック

トラックバックURI


一覧

この記事に対するトラックバックはまだありません。