0

メソッドがほとんどないjavascriptの単純なオブジェクトがあります..そのうちの2つは、window.setTimeout関数で定期的に呼び出したいです。私の現在のコードは次のようになります。

var shakeResolver = function () {
 var resolveTimeout;
 console.log(this);
 var context = this;
 this.startShakeResolve = function () {
     this.resolveTimeout = window.setTimeout(this.call(context.stopShakeResolve, context), 2000);
     $(window)
         .on('devicemotion', this.onDeviceMotion);
 };

 this.onDeviceMotion = function (event) {};

 this.stopShakeResolve = function (context) {
     this.resolveTimeout = window.setTimeout(context.startShakeResolve, settings.interval);

 };

}

問題は、スコープがどのように機能しているかを誤解しているようです。タイムアウトから関数を呼び出すと、実際には存在しない別のコンテキストから呼び出されるように見えますか?

4

2 に答える 2

1

call()最初のパラメーターとして、関数が呼び出されるコンテキストを取ります。これはthis.call(context.stopShakeResolve, context)、コンテキストを作成することcontext.stopShakeResolveを意味します。つまり、関数が呼び出されたときはとthis同等context.stopShakeResolveです。

明確にするために:

this.stopShakeResolve = function (context) {
    this.resolveTimeout = window.setTimeout(context.startShakeResolve, settings.interval);
};

内部に呼び出される関数がないshakeResolverため、この方法で呼び出されるプロパティまたはメソッドがないという例外がスローされます。呼び出しを次のように変更します。

this.stopShareResolve.call(this, context)
于 2012-10-04T08:09:25.560 に答える
1

変更されたコード: setTimeout のスコープは常にwindowObject です。call applyandを使用して関数のコンテキストを変更できますbind(bind は古い IE ブラウザ IE <= 8 ではサポートされていません)。

var shakeResolver = function() {
    this.resolveTimeout;
    console.log(this);
    var context = this;
    this.startShakeResolve = function() {
        this.resolveTimeout = window.setTimeout(function() {
            context.stopShakeResolve.apply(context, arguments);
        }, 2000);

        $(window).on('devicemotion', function(){
                    context.onDeviceMotion.apply(context, arguments);
            });
    };

    this.onDeviceMotion = function(event) {
    };

    this.stopShakeResolve = function(context) {
        this.resolveTimeout = window.setTimeout(function() {
            context.startShakeResolve.apply(context, arguments)
        }, settings.interval);

    };
}
于 2012-10-04T08:11:42.317 に答える