2011-08-09 99 views
1

我試圖做一個setTimeout,我將變量傳遞給setTimeout()內被調用的函數。經過一些初步的失敗,然後使用谷歌我發現一個網站,描述如何使用閉包做到這一點。我幾乎跟着例子,但我不斷收到一條錯誤消息:經過參數列表javascript關閉錯誤

此錯誤消息正在呼籲setTimeout的,但據我可以告訴一切被關閉

缺失)。任何幫助,將不勝感激:

var textureAtlas = new Image() 

function init() { 

    textureAtlas.src = "images/textureatlast1.png"; 
    var textureAtlasCoords = new Array("0,0", "100,0", "200,0", "300,0", "400,0", "500,0", "600,0"); 

    var canvas = document.getElementById('textureAtlas'); 

    if (canvas.getContext){ 

     var ctx = canvas.getContext('2d'); 

     for(var c=0; c<textureAtlasCoords.length; c++) { 

      var thisCoord = textureAtlasCoords[c]; 
      var thisCoordSplit = thisCoord.split(","); 
      var thisX = thisCoordSplit[0]; 
      var thisY = thisCoordSplit[1]; 

      var a = setTimeout(animate(){myFunction(ctx, textureAtlas, thisX, thisY); ctx=null, textureAtlas=null, thisX=null, thisY=null},1000); 
     } 

    } else { 
     alert("Looks like your browser doesn't support HTML5"); 
    } 

} 

function animate() { 

    ctx.drawImage(thisImg,thisX,thisY, 1024, 451, 0, 0, 1024, 451); 

} 
+0

在setTimeout調用,是「有生命的」一個錯字?或者你是否想要調用'animate'? – Lobstrosity

+0

動畫後的「{...}」是什麼? –

+0

如果它幫助我與這裏給出的示例工作:http://www.makemineatriple.com/2007/10/passing-parameters-to-a-function-called-with-settimeout – PruitIgoe

回答

1

另外:

function animate() { 

    ctx.drawImage(thisImg,thisX,thisY, 1024, 451, 0, 0, 1024, 451); 

} 

上下文這裏將引發 '未定義',作爲

var ctx = canvas.getContext('2d'); 

將只在init的範圍內可用。

你不嚴格需要一個「;」第一行之後:

var textureAtlas = new Image() 

然而,這將是一個非常好的主意,請參見:does javascript require ';' at the end of a line of code?

+0

感謝您注意到失蹤;這是我的一個錯字。 – PruitIgoe

+0

至於範圍評論,我最初測試這個代碼,它工作正常:imgDraw(ctx,thisImg); ...功能imgDraw(CTX,thisImg){ctx.drawImage(thisImg,0,0,1024,451,0,0,1024,451);} ...你說動畫()將拋出一個不確定的,因爲它被包含在setTimeout()中? – PruitIgoe

+0

我確實在想,實際上,封閉是一場噩夢,很少有解釋/記錄,我認爲它可能是可用的。關閉的麻煩在於他們可能會因爲你不期望的原因而工作。 :) – nicodemus13

2

我不完全清楚你想要安排在這裏。

我可以告訴你的setTimeout它可以是一個函數文本或函數引用,就像這樣:

  • 功能:

    setTimeout(nameOfMyFunction, 1000); // reference -- note, NO parentheses here 
    
    setTimeout(function() { // literal -- the function being executed is "anonymous" 
         /* body of function here */ 
        }, 
        1000); 
    

    在第一個語法,需要注意兩件事情很重要必須在其他地方正常定義nameOfMyFunction;

  • 使用此語法,您不能將任何參數傳遞給nameOfMyFunction

如果通過一些ARGS是很重要的,那麼你就可以在通過他們,像這樣的匿名函數包裹調用:

setTimeout(function() { 
     nameOfMyFunction(someArg, otherArg); 
    }, 
    1000); 

而且目前還不清楚是什麼myFunction是。 myFunction是否準備animate使用的繪圖環境?或者是其他的一次性操作,應該在animate之前發生?

+0

(及其他)我想運行在斷textureatlas的動畫,animate函數將收到的紋理圖像的x/y座標從我掛到上面的意見是,使用封閉我將能夠通過該網站我的理解(這可能是完全錯誤的) - Atlas和畫布,以將其放置在 – PruitIgoe

+0

參考,添加一些更詳細變量的函數稱爲setTimeout - 在這種情況下爲動畫,因爲您無法通過函數傳遞變量並將它們作爲第三個參數添加到setTimeout引發IE中的問題。 – PruitIgoe

0

替換:

var a = setTimeout(animate(){myFunction(ctx, textureAtlas, thisX, thisY); ctx=null, textureAtlas=null, thisX=null, thisY=null},1000); 
    } 

通過

var a = setTimeout(animate, 1000); 

我不知道你爲什麼包括animate(){...}

+0

我試圖傳遞變量的動畫() – PruitIgoe

1

試穿setTimeout加字function

 var a = setTimeout(function animate() { 
      myFunction(ctx, textureAtlas, thisX, thisY); 
      ctx = null, textureAtlas = null, thisX = null, thisY = null 
     }, 1000); 
+0

我在寫的setTimeout錯誤的:var A = setTimeout的(函數(){動畫(textureAtlas,thisX,thisY);},400); – PruitIgoe