Modifier la variable globale dans la fermeture de JavaScript

J'essaie de changer la valeur d'une variable dans une fermeture:

var myVariable; $.ajax({ //stuff.... success:function(data) { myVariable = data; } }); 

Cela ne fonctionne pas parce que myVariable n'est pas visible pour la fermeture. Comment puis-je modifier ce code de sorte que la valeur de myVariable change?

Contrairement à votre croyance, votre code fonctionne. Mais en voyant ce que vous essayez de faire et en lisant entre les lignes, je suppose que vous essayez de le faire:

 var myVariable; $.ajax({ //stuff.... success:function(data) { myVariable = data; } }); alert(myVariable); // at this point myVariable is undefined!! 

Si c'est le cas, vous devez connaître les fonctions asynchrones.

Fondamentalement, la fonction $.ajax() retourne avant de soumettre la requête ajax. Il fera la demande ajax plus tard lorsque le navigateur n'est pas occupé à exécuter javascript. Cela signifie que l'affectation ne sera pas encore arrivé lorsque vous essayez d'alerter la valeur de myVariable .

Lisez ma réponse ici pour plus de détails: la variable globale JS n'est pas définie lors de la première itération

La seule bonne solution est de changer votre façon de penser au codage. Marco ddeaeaeaAeaAeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaficeeaFeaeaeaeaFeaeaeaeaFeaeaFea Da MarcoHeaeaeaAFFGF La MarcoFea Da MarcoAndFemeaeaeaeaAFMFMMM MarcoAficidenceFenuraeaeaA DaAldeteaA DafefeeaeaeaAficfeAuvidence MarcoAfeficeaAfeeaeaeaeaA MarcoAeaeaeaAficfe Trause Daeaeaeaea Da Marco Traea citeaeaeaeaeaAeataeaeaeaeaeaeaeaeataAlteE Dafeidence Dafeidence Dafe Au lieu de faire ceci:

 var myVariable; $.ajax({ //stuff.... success:function(data) { myVariable = data; } }); /* * Do lots of stuff with the returned value * of the myVariable variable * */ 

Vous devez maintenant l'écrire comme suit:

 var myVariable; $.ajax({ //stuff.... success:function(data) { myVariable = data; /* * Do lots of stuff with the returned value * of the myVariable variable * */ } }); 

Déplacement basique de tout code que vous auriez écrit après l'appel ajax dans le rappel de succès. Cela s'habitue à (à en juger par le nombre de variantes de cette question sur Internet). Mais une fois que vous êtes habitué à cela, il devient une seconde nature.

Il y a un nom pour ce style de programmation. MarcoFeaMachach Chamélea illustrdddice Marco Daea citadineeadice Marco Marco Daea Marco Marco Daea Marco Marco Da Marco Da Marco Da Marco Da Marco Da Marco Daure Vous pouvez google les différents termes si vous souhaitez en savoir plus.

Si ce code est dans la portée globale, myVariable est visible pour la fonction interne. Si vous êtes préoccupé par le fait qu'elle soit ombrée par une variable locale, accédez explicitement à elle comme une propriété de la version globale:

 var myVariable; $.ajax({ //stuff.... success:function(data) { window.myVariable = data; } });