在这个demo中,如果我使用(没有换行)或(onLoad),我会得到不同的输出。
我的问题是,在html文件中,要获得正确的警报:1,2,3,4代码中需要进行哪些更改?通过简单的dojo加载,我在所有警报中始终为4:
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>
<script type="text/javascript">
var slider = [];
for (i = 0; i < 4; i++) {
slider[i] = function () {
alert([i]);
};
dojo.addOnLoad(slider[i]);
}
</script>
答案 0 :(得分:3)
您可以使用closure:
var slider = [];
for (i = 1; i < 5; i++) {
slider[i] = (function (i) {
return function () { alert([i]); }
})(i);
dojo.addOnLoad(slider[i]);
}
这会将i
保存到另一个保存状态的函数范围内。如果没有闭包,i
的范围将限定为原始函数。
答案 1 :(得分:0)
在循环结束时,i的值为4,这是您的函数在调用时将看到的值。这样的事情应该有效:
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>
<script type="text/javascript">
var slider = [];
for (i = 0; i < 4; i++) {
eval("slider[i] = function () { alert([" + i + "]);};");
dojo.addOnLoad(slider[i]);
}
</script>
编辑:你也可以尝试在调用函数时进行计数,而不是在定义函数时进行计数。 e.g。
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>
<script type="text/javascript">
var slider = [];
var onLoadCounter = 0;
var onLoadCallback = function() {
alert(onLoadCounter);
onLoadCounter++;
};
for (i = 0; i < 4; i++) {
slider[i] = onLoadCallback;
dojo.addOnLoad(slider[i]);
}
</script>