0

可能重复:
将正确的“this”上下文传递给 setTimeout 回调?

我的小脚本有问题。

function test() {
    this.arr = new Array('a','b','c');
    this.func = function() {
        //Do something with this.arr. But it's undefined.. WHY???
    }
    this.Start = function() {
        this.Interval = setInterval(this.func, 1000);
    }
}

var Test = new test();
Test.Start();

当我尝试对“func”中的数组做任何事情时,它一直告诉我,数组是未定义的。为什么?

4

2 回答 2

1

您得到错误的this参考,请尝试:

function Test() {
  this.arr = new Array('a','b','c');
  this.func = function() {
    console.log(this.arr);
  };
  this.start = function() {
    var fun = this.func.bind(this);
    this.interval = setInterval(fun, 1000);
  };
}

var test = new Test();
test.start();

如果您需要更多信息,这篇文章this非常有趣:函数调用和这个

另外,请注意我已经更改了某些符号的大小写。请记住,用作构造函数的函数以大写字母开头,变量和方法使用小写字母。

于 2012-08-05T19:50:26.653 回答
1

定时器/间隔在全局范围内被调用,因此“this”设置为“window”。为了解决这个问题,您可以将第三个选项传递给 setInterval(),它将用作指定函数调用的参数。

function Test(){
    this.array = new Array('a','b','c');
    this.function = funct(){ }
    this.start = function(){
        this.Interval = setInterval(function(passedObj){
            passedObj.funct.call(passedObj);
        },1000,this);
    }
}
var testObj = new Test();
testObj.start();

阅读下面的评论,您会发现这是针对 nodejs 的。但是,这不适用于 IE8 和/或更早版本。

于 2012-08-05T19:53:18.847 回答