2016-11-06 86 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; 
    } 
}; 

现在,您的通话将是有效的。

相关问题