(function () { var x = 1; return { f: function (x) { alert(x); } }; }()).f(2); Suppose I don't want to rename either variable. There is no way to, from within f, access the variable x, which was declared first - right?
5 Réponses :
Vous pouvez retourner la variable avec la fonction:
(function () { var x = 1; return { f: function () { alert(this.x); }, x:x }; }()).f();
correct. Parce que vous avez un autre x code> dans
fonction (x) code>, toute tentative d'accès
x code> obtiendra celui-ci (la portée la plus proche). Il bloque l'accès à tout
x code> dans une portée plus large. P>
Il n'y a aucun moyen de, à partir de l'intérieur
f code>, accédez à la variable
x code>, qui a été déclarée première p>
Non, il n'y a pas. La portée intérieure
x code> masque la portée externe
x code>. P>
xxx pré> Vous ne pouvez pas avoir une variable interne appelée "local ", bien sûr. ; -) p> blockquote>
Cela vous permet d'utiliser à la fois x (1) et x (2) en même temps.
(function () { var x = 1; return { f: function (x) { alert(x); // paramter (=2) alert(this.x); // scoped variable (=1) }, x:x }; }()).f(2);
Une approche intéressante. Merci! Cependant, dans le cas réel, je ne veux pas exposer à ce que x code>.
Conscient des appels ASYNC implicites qui vous font penser que vous ne pouvez pas accéder à une variable de la portée extérieure:
result = {} jQuery.ajax({ // it is a async call! url: "/some/url", success: function(data) { result = JSON.parse(data); } }); return result; // Result will be still {} because function returns before request has done.
Vous pouvez exposer la variable avec une méthode
Pourquoi ne voulez-vous pas renommer ni variable?
Le paramètre
x code> ombres i> la variable
x code>. Comme dans beaucoup d'autres langages de programmation (qui peuvent parfois être résolus, mais dans cet exemple, non).