IIFE的内部功能无法识别(function inside of IIFE not recogniz

2019-10-22 06:19发布

我有我想制作成书签的IIFE。 我想有模态的书签会弹出有一些按钮将调用一个函数。 然而,当我有这样的结构:

(function(){

   var __myFn = function(str){ //also have tried function __myFn(){..}
      alert(str);
   }

   //some AJAX that builds HTML with the `result`s

   document.getElementById("resultDiv").innerHTML = "<span onclick='__myFn(" + result.someData+ ")'>test</span>


}());

我得到Uncaught ReferenceError: __myFn is not defined

我怎样才能让这个功能识别? 有另一种方式?

Answer 1:

当您使用var关键字,你要创建一个变量是本地的封闭的上下文的范围。 由于封闭的上下文是一个函数, __myFn是本地函数本身并不能称为外(即不是在全球范围内已知的)。

如果你想使用的东西就在里面,你就必须引用返回。 您可以使用类似此模块模式:

var myModule = (function(){

   var __myFn = function(str) { 
      alert(str);
   }

   return {
       myFn: __myFn
   };

})();

然后,你可以这样做:

//some AJAX that builds HTML with the `result`s

document.getElementById("resultDiv").innerHTML = "<span onclick='myModule.myFn(" + result.someData+ ")'>test</span>

但是,我不建议你结合事件处理这种方式。 使用jQuery或使用DOM方法( addEventListener )绑定的事件处理程序。 这样,你甚至可以做到这一点的IIFE本身,这意味着您甚至不必从IIFE返回东西在里面。 这意味着你的全球背景下不被污染。 现在,你不得不返回从IIFE的时候,唯一的原因是因为你是通过HTML内嵌绑定的事件处理程序。

这里有两个例子。 第一种假定IIFE返回到参考__myFn

var resultDiv = document.getElementById("resultDiv");
resultDiv.addEventListener("click", myModule.myFn, false);

下面是做它的IIFE自身内的第二个例子:

(function(){

   var __myFn = function(str) { 
      alert(str);
   }

   var resultDiv = document.getElementById("resultDiv");
   resultDiv.addEventListener("click", __myFn, false);

})();


Answer 2:

至于原因,我不明白,我发现,服用“VAR”关报关使得它的工作。

实施例1(失败):

(function() {

    var counter = 0;
    var init = function() { console.log("init called"); }
})();

init(); // regardless of whether I named the function or not, this fails.

但是:实施例2(作品):

(function() {
    var counter = 0;
    init = function() { console.log("init called"); }
})();

init(); // this calls the function just fine.

请注意,您可以添加iife这样就好内的任何数量的功能。



文章来源: function inside of IIFE not recognized