【发布时间】:2012-10-04 16:17:13
【问题描述】:
我在 javascript 中有一个 simpe 对象,它的方法很少。我想用 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);
};
}
问题显然在于我误解了范围是如何工作的,看起来当从超时调用函数时,它是从另一个实际上不存在的上下文中调用的?
【问题讨论】:
-
在第一次调用
setTimeout时,您会立即执行一个函数,并将其返回值(恰好未定义)作为要调用的函数传递超时。 (编辑:当然,假设您使用this.call调用通常的Function.call而不是您自己的变体。) -
什么是
this?它是一个函数吗?你怎么打电话给shakeResolver?要了解有关this的更多信息,请查看developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…。
标签: javascript scopes