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