2017-10-06 60 views
-1

我再次問這個問題,因爲用戶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個問題:

  1. 爲什麼我必須分配給subArr[i]tmp?使用myFunc(subArr[i])會返回i未定義?
  2. 爲什麼在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](); 
     } 
    }); 
} 

回答

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 
+0

非常感謝喬納斯,非常詳盡!希望我從一開始就得到您真正有用的答覆! :) – Mark

0

爲什麼我必須分配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,你需要isubArr[i]複製到一個新的範圍,所以它不會改變未來你周圍的循環去的時間。

+0

你介意在我的代碼做一個實際的例子嗎?我不會離開它... – Mark