我有我想制作成书签的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
我怎样才能让这个功能识别? 有另一种方式?
当您使用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);
})();
至于原因,我不明白,我发现,服用“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这样就好内的任何数量的功能。