2016-11-06 85 views
-3

我有一個函數在一個立即調用的函數表達式中,我希望能夠全局訪問該函數,而不用從詞法上區分這種方式。Javascript:如何從全局代碼訪問本地函數

如何通過名爲「App」的名稱空間訪問此「私人」功能?

indew.html:

<html> 
     <head> 
      <meta charset="utf-8"> 
      <title>Test</title> 
      <script src="filtering.js"></script> 

     </head> 
     <body> 
      <article> 
       <p> 
        Computer graphics is widespread today. Computer imagery is found on televi 
        surfaces, illumination sources, and so forth, perhaps with a dynamic (time) component".[3] 
       </p> 
      </article> 
     <section id="result"></section> 

     <script> 
      App.showOccurenceFiltering(); // here is my wrong call 
     </script> 
    </body> 
</html> 

js腳本:

var App = (function() { 
function showOccurenceFiltering() { 
    "use strict"; 
    var filteredWordsArray = filtering(), 
     resultView = "<ol>"; 
    for (var i = 0; i < filteredWordsArray.length; i++) { 
     var partWord = filteredWordsArray[i].substring(0, filteredWordsArray[i].indexOf(" ")), // de 0 jusqua l espace : la partie mot 
      partNumber = filteredWordsArray[i].substring(filteredWordsArray[i].indexOf(" ") + 1); // de l'espace à la fin : la partie number 
     resultView += "<li>" + partWord + " (" + partNumber + ")</li>"; 
    } 
    resultView += "</ol>"; 
    document.getElementById('result').innerHTML = resultView; 
} 
}(App)); 

,所以我有一個未接來電像顯示捕獲的錯誤: enter image description here

我該如何解決我的問題??

回答

3

您需要將函數公開到全局範圍。你可以用一個命名空間做到這一點,是這樣的:

(function() { 
    function showOccurenceFiltering() { 
    "use strict"; 
    var filteredWordsArray = filtering(), 
     resultView = "<ol>"; 
    for (var i = 0; i < filteredWordsArray.length; i++) { 
     var partWord = filteredWordsArray[i].substring(0, filteredWordsArray[i].indexOf(" ")), // de 0 jusqua l espace : la partie mot 
      partNumber = filteredWordsArray[i].substring(filteredWordsArray[i].indexOf(" ") + 1); // de l'espace à la fin : la partie number 
     resultView += "<li>" + partWord + " (" + partNumber + ")</li>"; 
    } 
    resultView += "</ol>"; 
    document.getElementById('result').innerHTML = resultView; 
    } 

    // Prepare a "dummy" object 
    var obj = {}; 

    // Attach the private function to this object 
    obj.showOccurenceFiltering = showOccurenceFiltering; 

    // Attach the dummy object to the global scope in a controlled namespace: 
    window.App = obj; 

}()); 

然後你就可以進入功能如下:

App.showOccurenceFiltering(); 
0

你可以做到以下幾點:

var App = (function(){ 
var obj = {}; 
obj.showOccurenceFiltering = function() { 
    "use strict"; 
    var filteredWordsArray = filtering(), 
     resultView = "<ol>"; 
    for (var i = 0; i < filteredWordsArray.length; i++) { 
     var partWord = filteredWordsArray[i].substring(0, filteredWordsArray[i].indexOf(" ")), // de 0 jusqua l espace : la partie mot 
      partNumber = filteredWordsArray[i].substring(filteredWordsArray[i].indexOf(" ") + 1); // de l'espace à la fin : la partie number 
     resultView += "<li>" + partWord + " (" + partNumber + ")</li>"; 
    } 
    resultView += "</ol>"; 
    document.getElementById('result').innerHTML = resultView; 
} 
return obj; 
}()); 
0

App變量仍然爲undefined,因爲立即調用函數表達式不返回值。

取而代之的是,App作爲對象常量,如下所示:

var App = { 
    showOccurenceFiltering: function() { 
     "use strict"; 
     var filteredWordsArray = filtering(), 
      resultView = "<ol>"; 
     for (var i = 0; i < filteredWordsArray.length; i++) { 
      var partWord = filteredWordsArray[i].substring(0, filteredWordsArray[i].indexOf(" ")), // de 0 jusqua l espace : la partie mot 
       partNumber = filteredWordsArray[i].substring(filteredWordsArray[i].indexOf(" ") + 1); // de l'espace à la fin : la partie number 
      resultView += "<li>" + partWord + " (" + partNumber + ")</li>"; 
     } 
     resultView += "</ol>"; 
     document.getElementById('result').innerHTML = resultView; 
    } 
}; 

現在,您的通話將是有效的。

相關問題