JavaScript > Kanasan.JS JavaScript第5版読書会#2に行ってきました。
2008年01月15日
Kanasan.JS JavaScript第5版読書会#2 に参加して来ました。 前回のコードリーディング同様、かなり内容が濃かったです。id:amachangの参加をdel.icio.usで経由で知ったり、参加者がとても増えたので、急遽会場の変更等ありましたが、無事終えることができました。
今回僕は運営スタッフとしても参加させて頂いていて、当日の進行や段取り等、反省するべき点も色々とありましたが、皆様のおかげでとても良い勉強会になったと思います。ありがとうございました。
運営に手一杯で、正直、あまり集中して読書が出来なかったのですが、理解出来た範囲でまとめたいと思います。
ライトニングトーク
受付しながらだった事と、午後の準備等で、集中して見れていなかったのですが、 amachangによる、JavaScriptで非同期処理を行う為の「JSDeffered」が印象的でした。これは凄かった。
今回の資料とは異なりますが、以下が詳しいです。
今回の読書会では制御文と関数、オブジェクトの項目を読みました。以降は気になった所を走り書きしてみます。
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」が表示される。
どうしてか?
これは、ソースコードをコンパイルされて実行される手順を見ると分かります。
- まずは、一度全てのソースをパースする。この時に定義された関数を抜き出す。
- この時点でfは関数として定義されています。
- 次に一行ずつインタプリンタがソースをパースして、実行していく。
- 問い1の段階では、fは一度目のパースで関数としてパースされているので、普通に関数として実行出来る
- 次にインタプリンタが「var f」を見つけた時点で、「f」は変数として、上書きされる。
- インタプリンタが「function f」を見つける。しかし、functionは最初のパースで探しているので、二回目はパスされる。
- 結果として、「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
一覧
この記事に対するトラックバックはまだありません。

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