jQuery:将变量传递给for循环中声明的函数[竞争重复]

时间:2017-10-06 08:27:24

标签: javascript function variables for-loop scope

我再次提出这个问题,因为用户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);
        }
    });
}

这里我有两个问题:

  1. 为什么我必须将subArr[i]分配给tmp?使用myFunc(subArr[i])会返回i未定义?
  2. 为什么在myFunc我只收到subArr数组的最后一个值?
  3. 更新

    我已按如下方式更新了代码,但我得到了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]();
            }
        });
    }
    

2 个答案:

答案 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,您需要将isubArr[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