【原】JSにおける作用域――thisキーワードについて


いつでもjavascriptはthisをfunctionの中に入れます.
これは非常に単純な思想に基づいています.thisが含まれている場合(特に強調します.各関数にthisがあります.上の言葉を見てください.)最近の関数は直接あるオブジェクトのメンバーです.では、thisの値はこの対象です.thisを含む一番近い関数がある対象のメンバーでない場合、thisの値はあるグローバルオブジェクト(よくブラウザのwindowオブジェクト)に設定されます.
 
以下の内部関数はこのような考えを明確に示すことができる.
一つの関数が、ある変数に割り当てられていると、どのオブジェクトの下のメンバーにも属さないので、thisのパラメータはwindowオブジェクトになります.
var obj = {
  toString:function(){//  toString  。     ,     ,Object      toString   。
    return "obj    ";
  },
  func:function(){
    alert(this);//            obj
    var innerFunc = function(){//                ,            。
      alert(this);
    };
    innerFunc();
  }
};
obj.func()
 結果:
これにより「objの範囲内」と「Object Window(FF下テスト)」を出力します.
 
しかし、私たちは人工的に作用領域を変えることができます.
最後の行のコードをobj.func.call(window)に変えたら.
二回の出力の結果は全部「Object Window(FF下テスト)」です.
 
上記の例から、callは実際には別の方法であり、JSに属する言語の中核(Runtime)がobj.funcのために提供されるビルディング方法であることが分かります.
どちらの関数でも、主にtypeof foo==「function」が成立すると、必ずコールの方法があります.
 
コードを修正:
var obj = {
  toString:function(){//  toString  。     ,     ,Object      toString   。
    return "obj    ";
  },
  func:function(){
    alert(this);//            obj
    var innerFunc = function(){//                ,            。
      alert(this);
    };
    innerFunc.call(this);
  }
};
obj.func()
 このように、2回印刷した結果は、いずれも「objの範囲内」である.