Javascript :按值传递字符串
Javascript : Pass String by value
我的一个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 中是通过引用传递的,因此当我单击有问题的链接a
时,我总是看到array
的最后一个字符串。因此,我的问题是"如何按值传递myString
?感谢您的帮助!菲尔
您应该在事件处理程序周围添加一个闭包:
循环内的JavaScript闭包 - 简单的实际示例
a.addEventListener("click", function (s) {
return function () {
alert(s)
};
}(myString), false);
此外,您不应该在数组上使用for...in
循环。
在 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
属性中,因此您可以读取它,然后利用委托在元素的父级上注册一个处理程序:
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);
试试这个:我认为使用以下命令迭代数组总是好的。在
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);}
相关文章:
- 在函数中按值传递对象
- 变量/对象是否按值传递,为什么我不能在 javascript 中使用变量更改对象的属性
- Javascript :按值传递字符串
- 将字符串值传递到包含特殊字符的 JavaScript 函数中
- 按字符数隔离字符串的值
- 将字符串值传递给双引号
- 将变量从选择值传递到 JavaScript 函数 CDATA 字符串
- setTimeout 按值传递数组(在咖啡中)
- JavaScript 处理参数按值传递
- 为什么这个数组是通过引用而不是按值传递的,我该如何改变它
- Javascript函数的所有参数都只按值传递
- Javascript数组按值传递不起作用
- 将字符串传递给函数是按值复制还是按引用传递
- jQuery事件绑定按值传递
- Web Workers——如果对象是按值传递的,内存使用量会翻倍吗?
- 是JavaScript按引用传递或按值传递
- React:如果值是按值传递的,那么为什么有必要拥有不可变的道具呢
- 变量赋值 - Javascript: array1[0] = array2[0];这是按值传递还是按引用传递
- 我想按值传递数组,但似乎它是通过引用传递的,数组上的 .map 操作没有给出预期的结果
- 按值传递JavaScript数组