我尝试在实现setinterval函数后访问'this',但是无法从函数中访问它。说明如下:
apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
var self = this;
setInterval(this.print(),100);
},
print:function(){
console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}
输出:未定义
如果我传入this作为函数的参数,则间隔仅调用一次并停止。
apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
var self = this;
setInterval(this.print(this),100);
},
print:function(self){
console.log('print '+ self.apple + ' - ' + self.orange + ' - ' + self.pie);
}
输出:打印苹果 - 橙色 - 馅饼(之后停止)
在调用setinterval?
之后,如何才能访问'this'变量?答案 0 :(得分:3)
使用匿名函数使用自变量调用函数,该函数将确保使用self的范围调用函数,以便您可以使用此函数直接访问变量
initialize:function(){
var self = this;
setInterval(function() { self.print() },100);
},
print:function(){
console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
//console.log(apple);
//console.log(apple);
}
答案 1 :(得分:2)
setInterval(_.bind(this.print, this), 100);
答案 2 :(得分:0)
你应该使用匿名功能。
apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
var self = this;
setInterval( function() { self.print() },100);
},
print:function(){
console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}
答案 3 :(得分:0)
我今天遇到了这个问题但是在mozilla.org上找到了一个很好的解释,解释了这个问题和另一种解决方案:
从 https://developer.mozilla.org/en-US/docs/DOM/window.setInterval#The_.22this.22_problem
解释
setInterval()执行的代码在单独的执行上下文中运行 到它被调用的函数。结果,这个 被调用函数的关键字将被设置为窗口(或全局) 对象,它不会与函数的this值相同 这叫做setTimeout。请参阅以下示例(适用于praticity 使用setTimeout()而不是setInterval() - 问题实际上是 对于两个计时器都是一样的):
他们有一个适合我的解决方案
可能的解决方案
解决“这个”问题的一种可能方法是更换两者 本机setTimeout()或setInterval()全局函数有两个 非原生的,将通过它来调用它们 Function.prototype.call方法。以下示例显示了可能的情况 替换:
// Enable the passage of the 'this' object through the JavaScript timers
var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval;
window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeST__(vCallback instanceof Function ? function () {
vCallback.apply(oThis, aArgs);
} : vCallback, nDelay);
};
window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeSI__(vCallback instanceof Function ? function () {
vCallback.apply(oThis, aArgs);
} : vCallback, nDelay);
};