我可以在setInterval函数中将方法作为参数吗?

时间:2013-12-01 22:55:03

标签: javascript canvas html5-canvas setinterval pacman

Preety直截了当的问题,虽然我无法在任何地方找到答案 我试过这两种方式:

setInterval(function(){object/*or this*/.method()},500)

setInterval('object/*or this*/.method()',500)

2 个答案:

答案 0 :(得分:1)

setInterval实际上需要一个方法作为第一个参数,尽管有一种替代语法,其中第一个参数可以是一串代码(大多数不推荐)

如果您遇到该代码的问题,可能与“this”

的范围有关
setInterval(function(){this.method()},500)

在上面的代码中,'this'将引用闭包本身,并且与在该闭包之外发生的'this.method'不同。例如,以下内容可行:

function MyClass() {
    this.thingy = 'yep this is a thingy'
}
var myClass = new MyClass()

// Will log 'MyClass yep this is a thingy'
setInterval(function() { console.log('MyClass', myClass.thingy) }, 1000)

以下内容不起作用(假设实例化对象并调用foo()):

function MyOtherClass() {
    this.thingy = 'also a thingy'
}

// Will log 'MyOtherClass undefined'
MyOtherClass.prototype.foo = function() {
    setInterval(function() { console.log('MyOtherClass', this.thingy) }, 1000)
}

如果我们在闭包中使用'this'(假设实例化对象并调用bar()),第二个例子将起作用:

MyOtherClass.prototype.bar = function() {
    var that = this
    setInterval(function() { console.log('MyOtherClass', that.thingy) }, 1000)
}

还要确保传递setInterval函数的名称:

setInterval(someFunction, 500)

而不是将函数作为参数执行

setInterval(someFunction(), 500)

这最后一行代码通常是一个错误,除非someFunction()返回一个函数本身;)

答案 1 :(得分:0)

将函数传递给setInterval的两种方法之间的区别在于您是否希望将函数作为仅复制它的函数传递。请允许我通过例子解释:

-1参考(demo):

var obj = {
    testMethod: function () {
        console.log('function (testMethod): intial output');
    }
}
setInterval(function () {
    obj.testMethod()
}, 1000);
obj.testMethod = function () {
    console.log('function (testMethod): changed output');
}

运行此代码时,结果将执行testMethod的修改版本。因为在这里你不复制功能!相反,你引用它。因此,每当更改函数实现时,都会执行上一个修改版本。

-2复制(demo):

var obj = {
    testMethod: function () {
        console.log('function (testMethod): intial output');
    }
}
setInterval(obj.testMethod, 1000);
obj.testMethod = function () {
    console.log('function (testMethod): changed output');
}

您所要做的就是将最后定义的函数testMethod 副本 传递给setInterval。因此,无论您对testMethod所做的任何更改,setInterval的结果都不会更改。