Javascript继承和失去的“本”上下文(Javascript Inheritance and

2019-09-21 00:07发布

我使用约翰Resig的简单的JavaScript继承和在那里我失去了什么“这”指的是所遇到的问题。 使用此代码:

var Runner = Class.extend({ 
 init: function() {
  this.update();
  if(!this.interval) {
   this.interval = setInterval(this.update, this.period * 1000);
  }
 },
 stop: function() {
  clearInterval(this.interval);
 },
 update: function() {
  this.success()
 },
 success: function(){
 }
});

var SubRunner = Runner.extend({
 update: function() {
  this._super();
 },
 success: function(){
  alert('sub runner success');
 }
});

运行p = new SubRunner()工程,我期望和警报sub runner success的第一次。 后通过它第一次运行,然后尝试运行错误的“这个”(窗口)上成功的功能。

我知道原型给你一个绑定功能,让您可以通过上下文的功能,但我还没有在这里做类似的东西任何运气。 有没有人有一个起点,搞清楚了这一点?

谢谢!

Answer 1:

问题是,当你通过this.update到setInterval函数。 在JavaScript中,“这”取决于无论您使用点符号调用函数和函数不会记得他们来自何处,如果你将它们作为回调或将它们存储在一个变量来了。

您可以添加一个包装函数

var that = this;
setTimeout(function(){ that.update() }, this.perios*1000)

或者您可以使用如果可用绑定方法在你的浏览器(或者你可以在原型使用类似的功能)。

setTimeout(this.update.bind(this), this.period*1000)


Answer 2:

当你通过this.update给setInterval你失去的上下文。 最简单的办法是做

var that = this;
this.interval = setInterval(function() { that.update() }, this.period * 1000);


Answer 3:

this.interval = setInterval(this.update, this.period * 1000);

setTimeout调用它调用它在全球范围内的功能(它设置thiswindow )。

你需要通过调用一个函数this.update

var self = this;
this.interval = setInterval(function(){
    self.update();
}, this.period * 1000);


文章来源: Javascript Inheritance and losing the context of 'this'