第3回javascript勉強会
メンバーも増えてきて、楽しい勉強会になりました。
多面的に議論できて、充実しまくりです。
3章は当番の人が忙しかったので、先に4章を終えることができました。
ちょっと、質問祭りをしてしまって、本筋から離れた議論をしてしまいました。すみません。
運営方針
- 最強の言語JavaScriptの最強の本「さい本第5版」読む会
- 輪講形式:みんなでわからないところを考える→目標amachang
- ustreamで毎回録画
- 毎回誰かがレポートをあげてくれて、それと録画をみて復習や補習をする
4章
4-1 変数の型
- Javascriptには、型がないです
- 型が異なるものをいれて、下のようなコードが書けます
var i = 10;
i = " hehehe"
- では、「型付き」とはどのような利点があるか?
- データがどのような種類のものかを特定するのに使う
- 異なる型の値を入力すると、エラーが起こる
- プログラム上ありえない、データの使用を防ぐことができる
- 安心して、プログラムを書ける(コンパイラでエラーがでる。)
- 型に応じて、メモリの割り当て領域を確保する。
- よく、コンパイラ言語の本では、箱を確保する表現で説明される。
- コンパイル時の挙動
-
- FORTRAN
- 型あり
- とにかく早く動かすのが使命
- FORTRAN
- 型ありは多重継承の問題がある
- 詳しくは、『C++の設計と進化』をみよう。
4-2 変数の宣言
- 宣言とは?
var x;
4-3 変数のスコープ
- スコープとは何か?
- 変数の有効範囲
- javascriptのスコープは、関数の中だけ。
- ブロックではないことに注意
- スコープは狭いほうがいい
- 狭いほど、変数へのアクセスの見通しが分かりやすいから
- スコープチェーン:スコープ内に変数を見つけることができなかったら、上のスコープを探しに行く
- では、明示的に別のスコープ内の変数を見に行くことはできるか?
- たとえば、オブジェクト経由でがんばるとか(window.aaaで、グローバル変数を直接見に行ける。)
- 別関数内のローカル変数へのアクセスは無理
- callオブジェクトは、仮想的なオブジェクトだから
- こういうプログラムは、スパゲティの原因になるから、普通やるべきでない。
- グローバル変数はだめだよね。
- スコープの寿命
- レキシカルスコープ
- プログラム上の寿命
- ダイナミックスコープ
- プログラムが走っているときのスコープ
- 関数を実行しているときの寿命
- レキシカルスコープ
4-4 基本型と参照型
- 多言語との比較
- bindとは何か?
はどのような動作か?
var a =5
-
- 1.値を覚える空間(ヒープ)に、5ができる
- 2.スコープ空間に"a"という変数を作って、ヒープの5に結びつける
- 箱じゃないよね。ポインタっぽいよね。
- 値渡しとは?
- ヒープに同じものをコピーして、べつのオブジェクトを指すようにする
- 参照渡しとは?
- ヒープにあるおなじオブジェクトを指すようにする
- pointerと参照とはどう違うのか?
- pointerはbindが入っている
- 直接計算可能
- bindでは、計算できない
- pointerはbindが入っている
4-5 ガベージコレクション(Garbage Collection)
4-6 Variables as Properties
- 実行コンテキスト
- プログラム実行中にインタプリタが参照している名前空間
- 2つのwindows間で、javascriptを実行するときの問題
- どちらが実行コンテキストになっているか?
- globalはwindowごとに変わるよ><
- 13章をお楽しみに
- globalオブジェクト=window object
その他の話題
- cloneとは何か?
- 参照型のインスタンスのコピーをヒープ内に作ること
- 配列内の配列は、どのようにコピーされるのか?
- shadow clone:外側の配列はコピーされるが、要素としての配列は、同じ要素を参照している
- deep clone:外側の配列に加え、要素自身もコピーが作成される。
- thisは難しい
のとき、this=a
a.c=function(e){..this..};
a.c();
Event.observe($('id'),a.c());
関数を代入することと同じ効果
Event.observe($('id'),function(e){..this..});
a.cのthis=window
- thisに恋した人がよくやること
この場合、this=a
a.c=function(){..this..}
a.c()
この場合、this=b → thisを取り替え放題!!!
b.d=a.c
b.d()