Preety 直截了当的问题,虽然我在尝试这两种方法的任何地方都找不到答案:
setInterval(function(){object/*or this*/.method()},500)
和
setInterval('object/*or this*/.method()',500)
Preety 直截了当的问题,虽然我在尝试这两种方法的任何地方都找不到答案:
setInterval(function(){object/*or this*/.method()},500)
和
setInterval('object/*or this*/.method()',500)
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() 返回一个函数本身;)
将函数传递给的 2 种方法之间的区别在于,您setInterval
是否希望将函数作为其副本的参考来传递。请允许我举例说明:
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
. 因为这里你没有复制功能!相反,您引用它。因此,无论何时更改功能实现,都会执行最后修改的版本。
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
都不会改变。