2014-09-01 73 views
0

我不明白为什么这个变量变成私有的函数,即使我试图清除从控制台的间隔它无法找到变量,我必须做一些愚蠢的事情。请帮助,代码如下:我把它分解到相关部分。无法清除inverval函数从其他函数调用

function attack() { 
    $("#container").append("<div id='attacker' style='position:absolute; width: 128px; bottom:125px'>  <img src='attacker.gif' ></div>"); 
    $("#attacker").css("left", $(window).width()); 
    attackerCheck = setInterval(function() { moveNclear("#attacker", "attackerCheck"); }, 33); 
} 

function moveNclear(objectName, intervalname) { 
    objectP = $(objectName).position(); 
    $(objectName).css("left", (objectP.left - 10) + "px"); 
    if(objectP.left < 0) { 
    console.log("done"); 
    clearInterval(intervalname); 
    } 
} 
+0

如何/你在哪里调用'moveNclear'? – Victory 2014-09-01 21:17:27

+0

我以为不把“var”放在它之前,那么它会自动变成全局的?你能告诉我如何使它成为全球性的,我想这是问题所在。 – dprogramz 2014-09-01 21:17:48

+0

moveNclear被攻击函数调用一段时间,该函数将从其他地方调用 – dprogramz 2014-09-01 21:18:30

回答

2

可以避免通过使从moveNclear()合适的返回,并测试它放回调用函数以经过的时间间隔的参考。

此外,$("#attacker")(多次)是可怕的低效率......并且可以避免。

最后,别忘了用var本地化您的变量。不要使用全局变量。

尝试:

function attack() { 
    var $attacker = $("<div id='attacker' style='position:absolute; width:128px; bottom:125px'>  <img src='attacker.gif' /></div>").appendTo("#container").css('left', $(window).width()); 
    var attackerCheck = setInterval(function() { 
     if(moveNclear($attacker)) { 
      clearInterval(attackerCheck); 
      console.log("done"); 
     } 
    }, 33); 
} 

function moveNclear($el) { 
    var pos = $el.position(); 
    pos.left -= 10; 
    $el.css("left", pos.left + 'px'); 
    return (pos.left <= 0);//true:animation complete; false:animation in progress 
} 
+0

谢谢,我的错误部分 – dprogramz 2014-09-02 03:24:41

+0

@dprogramz,不一定是错误。在这件事上没有“完全正确”的东西。这主要是一个风格问题。 – 2014-09-02 05:16:28

0
var attackerCheck = null; 
function attack() 
{ 
$("#container").append("<div id='attacker' style='position:absolute; width: 128px; bottom:125px'>  <img src='attacker.gif' ></div>"); 
$("#attacker").css("left", $(window).width()); 
attackerCheck = setInterval(function() { moveNclear("#attacker"); }, 33); 

} 

function moveNclear(objectName) 
{ 
objectP = $(objectName).position(); 
$(objectName).css("left", (objectP.left - 10) + "px"); 
if(objectP.left < 0) 
{ 
console.log("done"); 
clearInterval(attackerCheck); 
} 

}