値渡しと参照渡し、クロージャ
引き続き JavaScipt 中級講座。これ、取っ付きにくいところも少なく、説明がわかりやすくて丁寧で、で、意外と細かいところも色々と説明してあって良い良い。
学んだこと
値渡しと参照渡し
変数を渡すときは値渡しだけど、オブジェクトを渡すときは参照渡しとなる。
実際にこんなの書いて実行してみたらとてもわかりやすかった。
function variable_pass(y) { y ++; } function object_pass(obj){ now.setHours(0); } var x = 10; document.write("渡す前の変数は" + x ); variable_pass(x); document.write("、渡したあとの変数は" + x + "<br>"); var now = new Date(); document.write("渡す前の Date オブジェクトの時間要素は" + now.getHours()); object_pass(now); document.write("、渡したあとの Date オブジェクトの時間要素は" + now.getHours());
書いてみたらすとんとわかったので、やっぱ書いてみるのって大事だなあ。
クロージャについて
JavaScript にはスタティック変数がない。スタティック変数とは宣言した関数の中でのみ使え、しかし関数が終了してもメモリから消えないもののこと。
今の自分にはいまいちこれのありがたみがわからない(グローバル変数じゃだめなの??って思ってしまう…)が、とにかく重要らしい。そのうちこれの重要さがわかるといいんだけど。
まあとにかく、クロージャというテクニックを用いるとこれと似たようなことが JavaScript でも実装できるらしい。
九章第五回 クロージャ — JavaScript初級者から中級者になろう — uhyohyo.net を読んで少しだけイメージが湧いたけど、どうやらこのクロージャを用いることによって変数の保護、されたくない動作の阻害などができるらしい。
function initCounter () { var count = 0; return function(){ count ++; return count; }; } var ct = initCounter(); document.write("ct = " + ct() + "<br>"); document.write("ct = " + ct() + "<br>");
これも書いてステップ実行したらやっていることがよくわかった。どういう時に使えるかは未だもやもやとしたイメージでしかないけど。
ct に initCounter() の値が入る時点では入るのはあくまで function() であり、count ではない。
ct() が実行されるときに初めて function() の中身が実行される。
これステップ実行しなかったらわからなかったなあ。