2013-08-20 54 views
1

我是Jquery的新手,我似乎无法找到造成此问题的原因。变量内部重复函数保留旧值

我有一个变量,每次运行GameStart()函数时都会得到一个新值,我试图在暂停函数中创建一个暂停函数,我有一个警报,显示变量的值(就像现在的测试一样)。

问题是,暂停点击事件不仅提醒当前值,而且还提醒以前的所有值。

这是什么原因?我能做些什么来解决它?

在小提琴示例中,按开始,然后按暂停,然后查看所有值。

的jsfiddle:http://jsfiddle.net/Limitedmoves/SrWJP/

$(document).ready(function() { 
    $('.butResize').click(function() { 
     alert("hello"); 
      GameStart();  
    }); 

    function GameStart(){ 
     //Set needed random variables below 
     var vSetTimer = 1000 * Math.floor(Math.random() * 10); 
     var vBarWood = 1 + Math.floor(Math.random() * 400); 

     setTimeout(function() { 
     //alert(vSetTimer); 
      $('.div').animate({height: vBarWood }, 500); 
     GameStart();  
    }, vSetTimer); //Time lenght set from vSetTime variable 

    $('.pause').click(function() { //Start pause function 
     var vTempTimer= vSetTimer; 
     console.log(vTempTimer);  
    }); 
} 
}); 

我已经看过在这里的计算器,发现类似的行为是通过利用“返回”解决了,但是从我已经尝试过了没有帮助。

事先感谢! :)

回答

1

@ ju-k的解释是正确的,并提供了一个工作解决方案。然而,另一种解决方案可能如下所示:

$(document).ready(function() { 

    $('.butResize').click(function() { 
     alert("hello"); 
     GameStart(); 
    }); 

    var vSetTimer; 
    var vBarWood; 

    function GameStart(){ 
    //Set needed random variables below 
     vSetTimer = 1000 * Math.floor(Math.random() * 10); 
     vBarWood = 1 + Math.floor(Math.random() * 400); 

     setTimeout(function() { 

      //alert(vSetTimer); 

      $('.div').animate({height: vBarWood }, 500); 

      GameStart();  

     }, vSetTimer); //Time lenght set from vSetTime variable 
    } 

    $('.pause').click(function() { //Start pause function 
     console.log(vSetTimer); 
    }); 

}); 

即,将变量移动到外部作用域,这也可以解决它,而不必每次都解除绑定/绑定。

编辑 正如在评论中指出的那样,没有解释为什么它在这个答案中表现得如此。这里是:

问题中行为的原因是,正如其他答案中所述,因为每次调用GameStart时,都会在与选择器“.pause”匹配的元素后附加一个点击处理程序。 。即第一次运行GameStart时,具有闭包变量(vSetTimer)的处理程序被追加到“.pause”按钮上。 GameStart下次运行时,它也会这样做,等等。这个闭包不会改变,这就是为什么第一次出现的相同数字第二次出现,接着是下一个闭包变量,依此类推。

+0

这是一个很好的答案,“我能做些什么来解决它?”。你可能会添加一个解释“这是什么原因?” – jukempff

+0

感谢您的更新,我现在正在使用此解决方案。从来不知道解决方案是这个初级。谢谢! – user2699097

3

每次调用GameStart时,都会向$('.pause')元素添加新的事件处理程序。

所以当你第二次打电话GameStart,点击.pause将触发2个功能。

一个简单的解决办法是unbind所有以前添加点击处理程序,添加一个新前:

$('.pause').unbind('click').click(function() { 
    ... 
}); 

编辑: 为了更好的和更清洁的解决方案看@比约恩·罗贝格的回答

+0

无需解除绑定。 – Amit

+0

你是对的,没有必要。但正如我指出的那样,这将是一个简单的**解决方案。 – jukempff

+0

谢谢你的意见,我试过了,它按我的需要工作。我想我现在必须阅读解绑。再次感谢你。 – user2699097

0

看看更新的fiddle,我已经添加了一个cleartimeout并解决了您的问题。

clearTimeout(timer); 

也是我把randNumberreSize()范围。

+0

谢谢你的帮助。我也实现了这个解决方案的一部分,因为它在按暂停时给了我Settimeout()的确切值。谢谢! – user2699097