2014-01-07 56 views
2

嘿,我在这里有一个小问题。局部变量覆盖函数在循环中多次运行

问:我怎样才能创建一个功能独特的变量,这样多次调用时,变量将举行他们应该(不交换)

记住我必须保持同步的循环会大而不运行异步将非常难以达到性能

我有一个在画布上绘制项目的函数。然后,我在for循环中运行此函数以根据数组中的某些数据绘制几个画布。

因此简化版本:

function renderCanvas(canvas, dID) { 
    var mName, bName, sName, tName; 
    this.layerCounter = mainData[dID]['layerCount']; 
    console.debug(designID + " has " + layerCounter + " layers"); 
    /* that gives 2 layers for first item and 3 for second)*/ 

    tctx2.clearRect(0, 0, tc2.width, tc2.height); 
    var imgPath = sName; 
    imgObj = new Image(); 
    imgObj.src = "img/" + imgPath; 
    imgObj.onload = function() { 

     tctx2.drawImage(imgObj, 0, 0, w, h, 0, 0, dw, dh); 
     layerCounter--; 
     console.debug(designID + " has " + layerCounter + " layers"); 

     tctx3.clearRect(0, 0, tc2.width, tc2.height); 
     var imgPath = tName; 
     imgObj = new Image(); 
     imgObj.src = "img/" + imgPath; 
     imgObj.onload = function() { 

      tctx3.drawImage(talphaObj, 0, 0, w, h, 0, 0, dw, dh); 
      layerCounter--; 
      console.debug(designID + " has " + layerCounter + " layers"); 
     }; 
    } 
} 
for (var i = 0; i < xArr.length; i++) { 
    var cDID = xArr[i]; 
    renderCanvas(contexts[i], cDID); 
} 

有什么建议?我对编程相当陌生,所以我可能错过了一些非常简单的东西。

+0

如果它的异步你想在这里使用闭包 – alfonsob

+0

不理解你的问题..你想分配给这个变量的值是什么?顺便说一句的上下文[i]没有在你的代码 – Merlin

回答

5

创下了JavaScript函数(即具有异步行为),这样你想使用一个封闭:

//im assuming contexts array is defined some where up here?? 

for (var i = 0; i < xArr.length; i++) { 
    var cDID = xArr[i]; 

    //the following function will self execute on each loop 
    (function (c, d) { 
     //Insert your renderCanvas function body here 
     //but use variable c and d in this closure. 
     //The values you have passed into this closure 
     //are now 'fixed' in this scope and cannot 
     //be interfered with by subsequent iterations 
    })(contexts[i], cDID); 
}}); 

基本上你是包装的功能在其他范围,以便对目前异步的下一次迭代循环,你不能覆盖你的局部变量(我认为这是你所指的变量被'交换'的行为)

这给了javascript关闭的一个很好的解释,它可以是一个令人困惑的主题! - How do JavaScript closures work?

+0

声明也作为daguru说你的上下文数组没有定义在任何地方? – alfonsob