0

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

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

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

2 回答 2

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() 返回一个函数本身;)

于 2013-12-01T23:23:39.783 回答
0

将函数传递给的 2 种方法之间的区别在于,您setInterval是否希望将函数作为其副本的参考来传递。请允许我举例说明:

-1 参考(演示):

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 复制(演示):

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都不会改变。

于 2013-12-01T23:36:46.050 回答