2017-10-06 4 views
-1

Je pose cette question à nouveau car l'utilisateur Cerbrus a marqué le previous question comme un doublon de this question. Quelqu'un peut-il être si gentil de me montrer comment la question indiquée par cet utilisateur, devrait résoudre le code ci-dessous? Je ne peux pas trouver une correspondance entre ces situations (même si elles sont similaires). Je dois transmettre une variable à une fonction dans une boucle for. Voici un exemple:jQuery: passage de la variable à la fonction déclarée à l'intérieur de la boucle [contestant le doublon]

var mainObj = [], 
    subArr = ['val1', 'val2'], 
    tmp; 

for (var i = 0; i < subArr.length; i++) { 
    tmp = subArr[i]; 
    mainObj.push({ 
     key: function(varsFromLibrary) { 
      myFunc(tmp); 
     } 
    }); 
} 

Ici, j'ai 2 problèmes:

  1. pourquoi dois-je attribuer à subArr[i]tmp? En utilisant myFunc(subArr[i]) retournera que i est indéfini?
  2. pourquoi dans myFunc je reçois seulement la dernière valeur de subArr tableau?

MISE À JOUR

J'ai mis à jour le code comme suit mais je reçois 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](); 
     } 
    }); 
} 

Répondre

0

Utilisez simplement nous:

for (var i = 0; i < subArr.length; i++) { 
    let tmp = subArr[i]; 
    mainObj.push({ 
     key: function(varsFromLibrary) { 
      myFunc(tmp); 
     } 
    }); 
} 

Ou pourquoi vous ne pouvez pas copier simplement la valeur dans l'objet?:

for (var i = 0; i < subArr.length; i++) { 
    mainObj.push({ 
     tmp:subArr[i], 
     key: function(varsFromLibrary) { 
      myFunc(this.tmp); 
     } 
    }); 
} 

Une autre tentative d'expliquer: Lets vous êtes imaginer un byciclist. Vous voulez mesurer votre vitesse pour que vous demandiez à 10 de vos amis de rester à côté de l'itinéraire à certains endroits et de vous dire votre vitesse. Certains pseudo-code:

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); 
    } 
}); 
} 

Maintenant, vous vous tenez par la suite au dernier point 10 avec vos amis et vous leur demandez la vitesse actuelle et le point qu'ils restent à. Que vont-ils vous dire? Exactement, ils sont tous debout à côté de vous au point 10 et votre vitesse actuelle est 0. Vous leur avez demandé la vitesse actuelle et non rappelez-vous la vitesse actuelle. Si vous voulez de se rappeler, ils doivent écrire:

friends.push({ 
    speed,//every friend object has the current value stored 
    point, 
    ask(){ console.log(this.speed,this.point)} 
}); 

Ou vous devez créer 10 univers parallèles amis restent, donc si vous leur demandez votre vitesse ils verront encore vous conduire suivant à eux:

for(let point = 1; point < 10; point++){ 
    let localspeed = (speed -= 2);//youre slowing down 
+0

Merci beaucoup Jonas, très complet! J'aimerais avoir votre réponse très utile dès le début! :) – Mark

0

pourquoi dois-je attribuer subArr [i] à tmp?

Vous n'en avez pas. Ce n'est pas la solution proposée par la question en double.

En utilisant myFunc (subArr [i]) retournera que je est indéfini?

i ne sera pas indéfini. Ce sera le même que subArr.length.

subArr[i] sera indéfini, car subArr.length est le nombre d'éléments dans le tableau et le tableau est indexé zéro. Pourquoi dans myFunc, je reçois seulement la dernière valeur du tableau subArr? Pourquoi? Parce que c'est la dernière valeur que vous avez copiée à tmp avant la fin de la boucle.


Comme le high rated answer on the question you link to says, vous devez copier i ou subArr[i] à un nouveau champ d'application de sorte qu'il ne changera pas la prochaine fois que vous allez dans la boucle.

+0

Pourriez-vous faire un exemple pratique sur mon code? Je n'en sors pas ... – Mark