jQuery:将变量传递给循环中声明的函数[竞争重复]
我再次问这个问题,因为用户Cerbrus已将previous question标记为this question的副本。 有人可以这么友好地告诉我这个用户指出的问题应该如何解决下面的代码?我找不到这些情况之间的匹配(即使认为它们是相似的)。jQuery:将变量传递给循环中声明的函数[竞争重复]
我需要将一个变量传递给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);
}
});
}
在这里,我有2个问题:
- 为什么我必须分配给
subArr[i]
tmp
?使用myFunc(subArr[i])
会返回i
未定义? - 为什么在
myFunc
我只收到subArr
数组的最后一个值?
UPDATE
我已经更新的代码如下,但我得到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]();
}
});
}
只需使用让:
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
为什么我必须分配subArr [I] TMP的?
你不知道。这不是重复问题提出的解决方案。
使用myFunc(subArr [i])将返回,我是undefined?
i
将不会被定义。它将与subArr.length
相同。
subArr[i]
将是未定义的,因为subArr.length
是数组中项目的数量,并且该数组是零索引。
为什么在myFunc中我只收到subArr数组的最后一个值?
因为这是循环结束前复制到tmp
的最后一个值。
随着high rated answer on the question you link to says,你需要i
或subArr[i]
复制到一个新的范围,所以它不会改变未来你周围的循环去的时间。
你介意在我的代码做一个实际的例子吗?我不会离开它... – Mark
非常感谢乔纳斯,非常详尽!希望我从一开始就得到您真正有用的答复! :) – Mark