2

今日、Javascriptでオブジェクトのメソッドを関数として渡すと、かなり奇妙な動作が発生することがわかりました。

 setTimeout(myObject.test, 100); // "this" is the global object window

メソッド「test」は正しく呼び出されますが、「this」はオブジェクト「myObject」ではなく、グローバルオブジェクト「window」です。次のようなことをすると、期待される動作を得ることができます。

setTimeout(function(){myObject.test()}, 100); // "this" is myObject

これは私にはかなり奇妙に思えます。誰でも説明できますか、これはなぜですか。

4

2 に答える 2

1

ランタイムはsetTimeoutonwindowオブジェクトの関数引数(最初の引数)を実行し、メソッドを引数として直接配置するため、最初のケースではウィンドウオブジェクトへの結合testであることがわかります。this

2番目のケースでは、windowオブジェクトで実行される関数は無名関数function() { myObject.test() }ですが、testメソッドはで呼び出されmyObjectます。そのためthismyObject

于 2013-03-25T09:28:00.687 に答える
1

JavaScriptがどのように解釈するかというこの疑似表現を考えてみてくださいsetTimeout(myObject.test, 100);

function setTimeout(func, millisec) {
    //some code...
    func(); //"this" in func will point to window
    //some code...
}

ただし、これを行うsetTimeout(function(){myObject.test()}, 100);setTimeout、渡した無名関数が実行されるためthis、無名関数は引き続きを指しますwindowが、その無名関数は別の関数myObject.test()を呼び出します。これは、関数がオブジェクトのメソッドとして呼び出されているため、thisそのオブジェクトを指すためです。 。

これは、クールなJS関数bindを使用して解決できます。

setTimeout(myObject.test.bind(myObject), 100); //now "this" will point to myObject.

より良い説明はJSの達人によってここにあります

于 2013-03-25T09:37:10.090 に答える