我再次提出这个问题,因为用户Cerbrus已将previous question标记为this question的副本。 有人可以这么好地向我展示这个用户指出的问题,应该解决下面的代码吗?我找不到这些情况之间的匹配(甚至认为它们是相似的)。
我需要将变量传递给for循环中的函数。这是一个例子:
var mainObj = [],
subArr = ['val1', 'val2'],
tmp;
for (var i = 0; i < subArr.length; i++) {
tmp = subArr[i];
mainObj.push({
key: function(varsFromLibrary) {
myFunc(tmp);
}
});
}
这里我有两个问题:
subArr[i]
分配给tmp
?使用myFunc(subArr[i])
会返回i
未定义?myFunc
我只收到subArr
数组的最后一个值?更新
我已按如下方式更新了代码,但我得到了TypeError: funcs[j] is not a function
var mainObj = [],
subArr = ['val1', 'val2'],
tmp,
funcs = [];
function createfunc(i) {
return function() { console.log("My value: " + i); };
}
for (var i = 0; i < subArr.length; i++) {
funcs[i] = createfunc(subArr[i]);
}
for (var j = 0; j < subArr.length; j++) {
tmp = subArr[i];
mainObj.push({
key: function(varsFromLibrary) {
funcs[j]();
}
});
}
答案 0 :(得分:0)
为什么我必须将subArr [i]分配给tmp?
你不是。这不是重复问题提出的解决方案。
使用myFunc(subArr [i])会返回我是未定义的吗?
i
未定义。它与subArr.length
相同。
subArr[i]
将是未定义的,因为subArr.length
是数组中的项目数,并且数组为零索引。
为什么在myFunc中我只收到subArr数组的最后一个值?
因为这是在循环结束之前复制到tmp
的最后一个值。
作为high rated answer on the question you link to says,您需要将i
或subArr[i]
复制到新范围,以便下次循环时不会发生变化。
答案 1 :(得分:0)
只需使用让:
for (var i = 0; i < subArr.length; i++) {
let tmp = subArr[i];
mainObj.push({
key: function(varsFromLibrary) {
myFunc(tmp);
}
});
}
或者为什么你不能简单地将值复制到对象中?:
for (var i = 0; i < subArr.length; i++) {
mainObj.push({
tmp:subArr[i],
key: function(varsFromLibrary) {
myFunc(this.tmp);
}
});
}
另一种尝试解释: 让我们想象你是一个byciclist。你想测量你的速度,所以你要求你的10个朋友在某些地方站在路线旁边并告诉你你的速度。一些伪代码:
const friends = [];
var speed = 20;//youre really fast
for(var point = 1; point < 10; point++){
speed -= 2;//youre slowing down
friends.push({
ask(){
console.log(point, speed);
}
});
}
之后,你和朋友一起站在最后一点10,然后问他们当前的速度和他们留下的点。他们会告诉你什么?确切地说,他们都站在你的第10点,你当前的速度是0.你问他们当前的速度而不是记住当前的速度。如果你想让他们记住它,他们需要把它写下来:
friends.push({
speed,//every friend object has the current value stored
point,
ask(){ console.log(this.speed,this.point)}
});
或者你需要创建朋友留下的10个平行宇宙,所以如果你问他们的速度,他们仍然会看到你在他们旁边开车:
for(let point = 1; point < 10; point++){
let localspeed = (speed -= 2);//youre slowing down