gpt4 book ai didi

javascript - 在纯 JavaScript 中使用数组内部的闭包

转载 作者:太空宇宙 更新时间:2023-11-04 16:17:27 24 4
gpt4 key购买 nike

我需要将数组内的字符串复制到循环中创建的另一个数组内的值。最后,当我打印时,所有名称都是名称数组中的最后一个。我想复制/克隆该值,这样我就没有引用,并且我希望它仅在 native JavaScript 中,而无需外部库。

这是我的代码

var exp_names =["name1","name2","name3"];
var i;
for (i = 0; i < exp_names.length; i++) {
d3.tsv("data/"+exp_names[i], function(data) {
data.forEach(function(d){
//Do stuff with my tsv
d.expId = exp_names[i];
});
});
});

然后所有expId都是“name3”

每个文件的数据加载正确。

我尝试过jquery的extend函数和lodash的clone函数,我也尝试过我自己的clone函数,但没有任何作用,它仍然会为所有expId抛出“name3”。

这些不起作用:

var newname = new String(exp_names[i]);
var newname = $.extend(true, {}, exp_names[i]);
var newname = $.extend( {}, exp_names[i]);
var newname = _.clone(exp_names[i]);
var newname = exp_names[i].slice(0);

我现在已经绝望了。

最佳答案

您需要使用bind功能。

var exp_names =["name1","name2","name3"];
var i;
var func = [];
for (i = 0; i < exp_names.length; i++) {
func[i]=(function(index){
d3.tsv("data/"+exp_names[index], function(data) {
data.forEach(function(d){
//Do stuff with my tsv
d.expId = exp_names[index];
});
});
}).bind(this,i);
}
for(i = 0; i < 3; i++){
func[i](i);
}

另一个解决方案是使用 let 关键字。

ES6 provides the let keyword for this exact circumstance. Instead of using closures, we can just use let to set a loop scope variable.

请尝试这个:

for (let i = 0; i < exp_names.length; i++) { 
d3.tsv("data/"+exp_names[i], function(data) {
data.forEach(function(d){
//Do stuff with my tsv
d.expId = exp_names[i];
});
});
}

关于javascript - 在纯 JavaScript 中使用数组内部的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com