2014-09-01 48 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); 
} 

}