2011-09-23 98 views
0

下面是https://github.com/Khan/khan-exercises/blob/master/khan-exercise.js自調用函數循環

for (var i = 0; i < loading; i++) (function(mod) { 
    if (!testMode && mod.src.indexOf("/khan-exercises/") === 0 && mod.src.indexOf("/MathJax/") === -1) { 
     // Don't bother loading khan-exercises content in production 
     // mode, this content is already packaged up and available 
     // (*unless* it's MathJax, which is silly still needs to be loaded) 
     loaded++; 
     return; 
    } 

    // Adapted from jQuery getScript (ajax/script.js) 
    var script = document.createElement("script"); 
    script.async = "async"; 

    for (var prop in mod) { 
     script[ prop ] = mod[ prop ]; 
    } 

    script.onerror = function() { 
     // No error in IE, but this is mostly for debugging during development so it's probably okay 
     // http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer 
     Khan.error("Error loading script " + script.src); 
    }; 

    script.onload = script.onreadystatechange = function() { 
     if (!script.readyState || (/loaded|complete/).test(script.readyState)) { 
      // Handle memory leak in IE 
      script.onload = script.onreadystatechange = null; 

      // Remove the script 
      if (script.parentNode) { 
       script.parentNode.removeChild(script); 
      } 

      // Dereference the script 
      script = undefined; 

      runCallback(); 
     } 
    }; 

    head.appendChild(script); 
})(urls[i]); 

奇怪的代碼:而不是通常的for循環代碼塊中,我們看到自調用函數(內其他自調用函數),這是爲什麼!?這個函數將如何運行?

+0

這是一個規則的循環。這實際上只是一個沒有{}的聲明。 – BNL

+0

只有一個「自我調用函數」,它是爲'urls'數組中的每個元素執行的函數。唯一的其他功能是事件處理回調。 –

+0

自調功能?廢話。你的意思是立即調用函數':P' –

回答

3

基本上for loop每次運行該函數的值爲url[i]傳遞到mod參數。

for (var i = 0; i < loading; i++) (function(mod) {...The code...})(urls[i]); 

,如果你在代碼中發現你會看到這個

(function(mod) {...The code...})(urls[i]) 

這是一個函數調用中傳遞urls[i]的參數mod

+0

看到什麼都沒有意義,因爲我沒有看到任何內部封閉使用的值。 – Prusse

+0

@Prusse ...'mod'遍佈各地?我不明白你的意見? –

+2

另外,創建一個局部變量'script'。立即調用的函數表達式在這裏充當命名空間 - 它的用法是爲了方便。 –

1

這是一個奇怪的概念,但是基本上如果你排除{} from for循環,它將簡單地爲每次迭代運行下一行,這與{}if相似,如果您需要單行if

所以它基本上是相同的:

function doSomething(){...} 

for (var i = 0; i < loading; i++) { 
    doSomething(urls[i]); 
} 

如果DoSomething的是,大功能。