9
votes

Accéder à la variable dans la portée extérieure?

(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?

3 commentaires

Vous pouvez exposer la variable avec une méthode


Pourquoi ne voulez-vous pas renommer ni variable?


Le paramètre x ombres la variable x . Comme dans beaucoup d'autres langages de programmation (qui peuvent parfois être résolus, mais dans cet exemple, non).


5 Réponses :


1
votes

Vous pouvez retourner la variable avec la fonction:

(function () {
    var x = 1;
    return {
        f: function () {
            alert(this.x);
        },
        x:x
    };
}()).f();


0 commentaires

11
votes

correct. Parce que vous avez un autre x dans fonction (x) , toute tentative d'accès x obtiendra celui-ci (la portée la plus proche). Il bloque l'accès à tout x dans une portée plus large.


0 commentaires

1
votes

Il n'y a aucun moyen de, à partir de l'intérieur f , accédez à la variable x , qui a été déclarée première

Non, il n'y a pas. La portée intérieure x masque la portée externe x . xxx

Vous ne pouvez pas avoir une variable interne appelée "local ", bien sûr. ; -)


0 commentaires

5
votes

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


1 commentaires

Une approche intéressante. Merci! Cependant, dans le cas réel, je ne veux pas exposer à ce que x .



0
votes

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.


0 commentaires