o。 onclick = test1() ;
このように、本質的には、クリックイベントのハンドルを取得したら、test1()関数の実行を指示することになります。実行に割り当てるのではなく、実行をガイドすることに注意してください。 test1() の所有者は変更されておらず、ウィンドウのままです。
[関数の参照]
上記と同様に、HTML にインラインで呼び出しを記述して呼び出しても、参照のままです。メソッド
div をクリックした実行結果これはまだウィンドウを指していることを示しています。
[関数コピーの例]
element.onclick = doSomething
element.addEventListener('click',doSomething,false)
element.onclick = function () {this.style.color = '#cc0000';}
これらのメソッドは、this のポインタを現在呼び出されているオブジェクトに変更します。
[関数の参照例]
element.onclick = function () {doSomething()}
element.attachEvent('onclick',doSomething)
メソッド 関数の所有者は変更されません。attachEvent は関数をコピーするのではなく、doSomething への参照を実際に確立するため、addEventListener とattachEvent は矛盾していることに注意してください。
[call メソッドを使用する]
先ほど述べたように、
を記述しても test() の所有者を にすることはできません。これを行うことができます
function (o) {
o.title = 'me';
}
このような明示的な呼び出しは問題ありません。あるいは、call または apply を使用して継承メソッドを偽装することもできます
function test () {
this.title = 'me';
これは、オブジェクトのなりすましの最も典型的な方法でもあります。
【自由変数問題】
長々と書いたので元の問題に戻りましょう:
var name = 'hong' var obj = {
name: 'ru',
getName: function(){
return function(){
return this.name;
}
}
alert(obj.getName()()); > この方法で得られた結果が「hong」になるのはなぜですか?フォーカスは
コードをコピーします
上記の関数参照の例を比較すると、返された匿名関数の呼び出しメソッドが同じであることがわかります。 onclick = function () {doSomething()} 同じです。したがって、このメソッドはこの関数の所有者を変更しません。これは入れ子関数ですが、その宣言はトップレベルです。このうち、これは窓口を指します。
2 番目の方法は、getName() 内の that に this を強制的に割り当てることです。つまり、that.name は実際には getName() 内の this.name と同じになります。 getName のコンテキストでは、その所有者はオブジェクト obj なので、これは obj を指すことになるので、 this.name === obj.name
という大きな循環を経てきましたが、どうかはわかりません。私はあなたに明らかにしました。
実際、これは次のように要約できます。 this が配置されている関数コンテキストで、この関数が「メソッド」の形式で呼び出されない場合、これは window オブジェクトを指します。それ以外の場合、これはウィンドウ オブジェクトを指します。この関数の所有者を指します。