我的一个javascript代码有点问题。这是代码
//assume array is an array containing strings and myDiv, some div in my doc
for(var i in array) {
var myString = array[i];
var a = document.createElement('a');
a.innerHTML = myString;
a.addEventListener("click", function() {myFunc(myString)}, false);
myDiv.appendChild(a)
}
function myFunc(s) {alert(s);}
但是,由于字符串是在JavaScript中通过引用传递的,因此当我点击相关链接array
时,我会始终看到a
的最后一个字符串。因此,我的问题是“我如何通过价值传递myString
?”。谢谢您的帮助 !
菲尔
答案 0 :(得分:2)
原始变量不在Javascript中通过引用传递。
这是在封闭内部调用的经典'循环变量'问题
这是解决该问题的一种常用解决方案:
for (var i = 0, n = array.length; i < n; ++i) {
var myString = array[i];
var a = document.createElement('a');
a.innerHTML = myString;
a.addEventListener("click", make_callback(myString), false);
myDiv.appendChild(a)
}
function make_callback(s) {
return function() {
alert(s);
}
}
请注意,这并不特别节省内存,因为它为数组中的每个元素创建了一个新的函数范围。
更好的解决方案可能是将变量数据实际存储在元素上(即作为新属性)并在回调中检索它。事实上,您已经将该字符串存储在.innerHTML
属性中,因此您可以只读取该字符串,然后利用委托仅在元素上注册一个处理程序&#39;父:
for (var i = 0, n = array.length; i < n; ++i) {
var a = document.createElement('a');
a.innerHTML = array[i];
myDiv.appendChild(a)
}
myDiv.addEventListener('click', function(ev) {
alert(ev.target.innerHTML);
}, false);
答案 1 :(得分:2)
您应该在事件处理程序周围添加一个闭包:
JavaScript closure inside loops – simple practical example
a.addEventListener("click", function (s) {
return function () {
alert(s)
};
}(myString), false);
此外,您不应在数组上使用for...in
循环。
答案 2 :(得分:-1)
试试这个: 我认为使用for ... in
来迭代数组总是好的for(var i=0; i<array.length;i++) {
var myString = array[i];
var a = document.createElement('a');
a.innerHTML = myString;
a.addEventListener("click", function() {myFunc(myString)}, false);
myDiv.appendChild(a)
}
function myFunc(s) {alert(s);}