Javascript – Appeler une variable de l’extérieur de If / Else Block renvoie Undefined

Je pensais que c’est ainsi que vous créez une variable dans un bloc if / else global (cas 3).

connection.query(sql, function (err,rows){ //Handle Errors if(err){ //Log The Error & Die } //If Successful - Log Results For Now (Change To Export Results) else { //console.log(rows); foo = rows; } }); console.log(foo); // Out: undefined 

Pourquoi ne puis-je pas accéder à la variable en dehors de la fonction?

SOLUTION

Eh bien, le problème ici était de comprendre ce qu’est réellement l’ asynchronicité. Après avoir discuté avec @AmmarCSE et avoir examiné cette excellente question ici sur SO, j’ai compris que j’avais structuré ma question (et mon code, évidemment) de manière incorrecte.

J’essayais d’accéder à une variable qui n’est pas définie jusqu’à ce que la fonction ait fini de s’exécuter (une requête SQL adressée à une firebase database distante prend évidemment plus de temps que l’exécution d’un script local). Si je structure mon code de manière asynchrone , cependant, la variable n’est appelée qu’une fois la fonction terminée .

En fin de compte, cela n’est pas un problème de scope variable, mais bien de durée variable (je ne sais pas si c’est la terminologie correcte pour le moment dans le script où les variables sont définies – majors de la CS, n’hésitez pas à les modifier) le terme correct).

Quoi qu’il en soit, voici le nouveau code:

 runSQL(function(result){ //Do Whatever you want with the results - they're defined!! console.log(result); )}; function runSQL(callback){ connection.query(sql, function (err,rows){ //Handle Errors if(err){ //Log The Error & Die } //If Successful - Log Results For Now (Change To Export Results) else { callback(rows); } }); } 

Lorsque vous êtes dans le error callback , sa propre scope est définie. Par conséquent, foo n’est visible que par cette fermeture et par toutes les fermetures nestedes. Pour le cas 3, vous avez mentionné dans le lien

 var a = 1; function four() { if (true) { var a = 4; } alert(a); // alerts '4', not the global value of '1' } 

ils alertent la variable à l’intérieur de la fermeture correcte, function four() , même si cette variable a été définie dans le bloc if , elle est visible pour la fonction parente.

Cependant, vous foo global sans préfixer var . Cependant, la journalisation après le rappel a pour résultat undefined car à ce moment-là, foo n’était pas encore défini. Si vous vous connectez dans le rappel d’erreur, cela fonctionnera, mais je vous conseille de restructurer votre code pour qu’il fonctionne avec la nature asynchrone des rappels.

 connection.query(sql, function (err,rows){ //Handle Errors if(err){ //Log The Error & Die } //If Successful - Log Results For Now (Change To Export Results) else{ //console.log(rows); foo = rows; } console.log(foo); }); 

si vous mettez un var foo = "something" dans quelque part cela équivaudrait à “quelque chose”. Je suppose que cela n’est pas entré dans le cas contraire, sinon cela équivaudrait à des rows égales … Est-il également possible que les rows soient indéfinies?

Aussi, sans utiliser var foo = n’importe où, il devient une variable globale si le bit foo = est exécuté, ce qui n’est probablement pas souhaitable …

 var result= connection.query(sql, function (err,rows){ //Handle Errors if(err){ //Log The Error & Die } //If Successful - Log Results For Now (Change To Export Results) else{ //console.log(rows); document.foo = rows; } }); result.on('result', function(){ console.log(document.foo); }