Javascript Can';t使用';这';内设定间隔
似乎我不能在Javascript Can';t使用';这';内设定间隔,javascript,prototype,Javascript,Prototype,似乎我不能在setInerval函数中使用this。为什么呢?什么是优雅的解决方案 var something=函数(tMessage){ this.message=tMessage; }; something.prototype={ 启动:功能(计数器){ document.getElementById('result').innerHTML++=this.message++++++; var looper=setInterval( 函数(){ //这是打印“未定义” document.ge
setInerval
函数中使用this
。为什么呢?什么是优雅的解决方案
var something=函数(tMessage){
this.message=tMessage;
};
something.prototype={
启动:功能(计数器){
document.getElementById('result').innerHTML++=this.message++++++
;
var looper=setInterval(
函数(){
//这是打印“未定义”
document.getElementById('result').innerHTML+=this.message+“
”;
如果(!计数器--)
清除间隔(活套);
},
20
);
}
};
window.onload=函数(){
var e=新事物(“hi”);
e、 启动(2);
}
编辑
谢谢你的回答!!但是有人能解释发送参数和设置以及额外变量之间的区别吗?有内存问题吗?您不能使用
此
,因为您处于新的功能块中。我总是创建一个局部变量(我相信有更好的方法):
这里的问题是,当调用函数时,
此
引用全局对象。要保留当前作用域,您可以关闭:
var looper = setInterval(
(function(scope){
return function(){
// This will no longer be printing "undefined"
document.getElementById('result').innerHTML += scope.message + "<br />";
if(!counter--)
clearInterval(looper);
};
})(this),
20
);
var looper=setInterval(
(职能(范围){
返回函数(){
//这将不再打印“未定义”
document.getElementById('result').innerHTML+=scope.message+“
”;
如果(!计数器--)
清除间隔(活套);
};
})(此),,
20
);
我将引导您找到这个极好的答案,而不是手工操作并试图解释闭包(我仍在完全掌握闭包的过程中):Add
var self = this;
就在您调用setInterval并使用self而不是set*interval中定义的函数之前,因为问题被标记为[prototypejs],但没有人使用Prototype,所以我决定编写一个真正使用Prototype()的答案
var Something=Class.create({
初始化:函数(tMessage){
this.message=tMessage;
},
启动:功能(计数器){
this.counter=计数器;
$(“结果”).innerHTML++=this.message++++++
;
this.looper=setInterval(this.addMessage.bind(this),20);
},
addMessage:function(){
$(“结果”).innerHTML+=this.message+“
”;
如果(!this.counter--){
clearInterval(此为活套);
}
}
});
document.observe(“dom:loaded”,function()){
var e=新事物(“hi”);
e、 启动(2);
});
document.getElementById()
window.onload
someObject.someFunction()
时,在someObject
的上下文中执行someFunction()
,并且此在someFunction()
的内部将指向someObject
但是您可以进行赋值someOtherObject.someFunction=someObject.someFunction
,然后在someOtherObject.someFunction()
中,此
将指向someOtherObject
您还可以将对函数的引用传递到另一个函数中,就像您在setInterval()
中所做的那样,然后执行上下文将由setInterval()
定义(实际上它将是全局上下文,即this==window
)
为了将执行上下文绑定到函数(预定义上下文,覆盖调用程序的上下文),您需要使用.bind()
方法。它返回新函数,无论运行时的上下文是什么,它都将使用所需的上下文调用原始函数。因为setInterval()回调函数中的this==窗口尽管答案正确,但我不会说(不要混淆)您不能使用this
。你可以,但它指的是不同的背景。我理解得对。我接受Asads答案的唯一原因是,对于参数,“额外变量”的范围较小(可能出现的错误较少)。虽然我认为这本书更具可读性。谢谢你的回答:)这应该是公认的答案。我通常这样做:让self=this代码>超级简单,完成了任务。我重新标记了问题,因为我不知道有一个名为“prototypejs”的库。
var self = this;
var Something = Class.create({
initialize: function(tMessage) {
this.message = tMessage;
},
start: function(counter) {
this.counter = counter;
$("result").innerHTML += this.message + "+++<br />";
this.looper = setInterval(this.addMessage.bind(this), 20);
},
addMessage: function() {
$("result").innerHTML += this.message + "<br />";
if (!this.counter--) {
clearInterval(this.looper);
}
}
});
document.observe("dom:loaded", function() {
var e = new Something("hi");
e.start(2);
});