Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t使用';这';内设定间隔_Javascript_Prototype - Fatal编程技术网

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);
    });