値渡しと参照渡し、クロージャ

引き続き 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() の中身が実行される。
これステップ実行しなかったらわからなかったなあ。