Javascriptのグローバル変数とローカル変数

まぁいまさらな話ですがメモメモ

Javascriptグローバル変数は全部windowオブジェクト(グローバルオブジェクト)のプロパティです。気をつけないといけないのはいかなる場所でもvarなしで宣言というか勝手に変数を作ったらグローバル変数になってwindowオブジェクトに引っ付いてしまうということです。そんな変数にでっかい値を突っ込んだりしたら無駄にメモリを消費し続けてしまうので気をつけましょう。

ではローカル変数とは?意外と知らない人もいるようですね。
単純に言うと"Callオブジェクトと呼ばれるオブジェクトのプロパティ"です。

Callオブジェクトとはなにか?

Javascriptは関数の実行コンテキストに入ったときにグローバル名前空間にない特殊なオブジェクトを生成します。これがCallオブジェクト。で、たとえば

function hoge(){
  var foo = 'foofoo', bar = 'barbar';
}

とすると関数内には

Call = {
  foo : 'foofoo',
  bar : 'barabar'
};

というような形になってることになります。
さらにCallオブジェクトは最初からargumentsオブジェクトを持ってるので
実際には

Call = {
  foo : 'foofoo',
  bar : 'barabar',
  arguments: 省略
};

となってます。argumentsに関してはここでは割愛します。面倒なので。

そんなこんなで単純に再度まとめると

  • グローバル変数はwindowオブジェクトのプロパティ
  • ローカル変数はCallオブジェクトのプロパティ


ということですね。この辺意外と奥が深いのでいろいろ調べると面白いですよw