関数が実行されるとCallオブジェクトというオブジェクトが作成される。
ここには引数の値(Argumentプロパティ)や関数内で使用するローカル変数の値が格納される。
ローカル変数のスコープ(ある変数が有効となる範囲)はこの関数のみで、もし、この関数内に
定義されていない変数を呼び出した場合、この関数が属するグローバルオブジェクトに
変数が定義されていないか探しに行く。これをスコープチェーンという。
グローバルオブジェクトに変数が定義されていなければUndefienedとなり、探索は終了する。
Callオブジェクトは直接操作することは不可能。
Callオブジェクトは関数実行が終了すると同時にガーベッジコレクションの対象となり、
消える。が、先ほどのスコープチェーンを応用するとCallオブジェクトをガベコレの
対象から外すことができる。
これにより、特定のメソッドを通じてのみアクセスが可能な変数を定義することもでき、名前空間の衝突や
予期しないアクセスによる変数の変更ということも避けることが出来る。
ex.
var y={}; (function() { var num=1; var str="hello"; var getNum=function() { return num; }; var setNum=function(nnum) { if(typeof nnum=="number") num=nnum }; var getStr=function() { return str; }; var setStr=function(nstr) { if(typeof nstr=="string") str=nstr; }; y.getNum = getNum; y.setNum = setNum; y.getStr = getStr; y.setStr = setStr; })(); alert(y.getNum());//1 y.setNum(35); alert(y.getNum());//35
ちなみに関数内の変数にthisをつけてはならない。(this.numとか)
もし、ここでthisキーワードを付けた場合、
thisキーワードが何を指すかと言えば、yオブジェクトである。