setInterval函数无法读取数组

时间:2012-08-05 19:40:50

标签: javascript node.js

  

可能重复:
  Pass correct “this” context to setTimeout callback?

我的小脚本有问题。

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”中对数组做任何事情时,它一直告诉我,数组是未定义的。为什么呢?

2 个答案:

答案 0 :(得分: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的文章非常有趣:Function invocation and this

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

答案 1 :(得分: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和/或更早版本不起作用。