这是使用闭包更新数组的最佳方法吗?我在另一个网站上看到了类似的东西。我想知道创建的全局变量closure1
。有没有办法在不创建全局的情况下做到这一点。
<script>
var closure1=Closure(0, 0);
function Closure(num, i) {
var num=num;
var index=i;
var anArray = [];
return function(num,index) {
anArray[index]=(num);
out.innerHTML=anArray;
}
}
</script>
<div id="d1" onclick=" closure1(2,0)">2 index 0</div>
<div id="d2" onclick=" closure1(5,3)">5 index 3</div>
<div id="d3" onclick=" closure1(4,1)">4 index 1</div>
<div id="d4" onclick=" closure1(9,7)">9 index 7</div>
<div id="out" >?</div>
答案 0 :(得分:0)
我认为你可以做这样的事情。如果您不想创建全局变量,请将脚本包装在自执行函数中。
(function(){
var closure1=Closure(0, 0);
function Closure(num, i) {
var num=num;
var index=i;
var anArray = [];
return function(num,index) {
anArray[index]=(num);
out.innerHTML=anArray;
}
}
}());
答案 1 :(得分:0)
您需要有一种方法来调用您创建的闭包,以便在onclick
属性中使用它。将closure1
作为全局变量的优点是闭包只创建一次,您可以通过调用closure1(num, index)
在页面中重复使用它。但是,如果您不希望在全局范围内使用名为closure1
的变量,则可以通过以下方式清理。
编辑:我之前发布了两种建议的方法。感谢@nnnnnn指出其中一种方法会破坏OP的代码。我删除了错误的建议,并保留了正确的建议。
您可以将闭包添加为现有Closure
函数的属性。例如,如果要创建新的闭包closure1
,则应该像这样创建它
删除该行:
var closure1=Closure(0, 0);
添加以下行 AFTER 已定义Closure
函数,如下所示:
Closure.closure1 = Closure(0, 0);
并用
替换你的onclicks<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>
完整的代码如下所示:
<script>
function Closure(num, i) {
var num=num;
var index=i;
var anArray = [];
return function(num,index) {
anArray[index]=(num);
out.innerHTML=anArray;
}
}
Closure.closure1 = Closure(0, 0);
</script>
<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>
<div id="d2" onclick="Closure.closure1(5,3)">5 index 3</div>
<div id="d3" onclick="Closure.closure1(4,1)">4 index 1</div>
<div id="d4" onclick="Closure.closure1(9,7)">9 index 7</div>
<div id="out" >?</div>
在我看来,这是最干净的方法。希望这会有所帮助。