web-dev-qa-db-fra.com

JavaScript: variables d'accès à l'intérieur d'une fonction anonyme de l'extérieur

Disons que j'ai cette fonction anonyme:

(function(window){

 var private = 'private msg';

 function sayit() {
   alert(private) // works
 }

 document.body.onclick = sayit; // works

})(window);

// private shouldn't be accessible here

Est-ce ainsi que JavaScript devrait se comporter?

Autrement dit, il n’existe aucun moyen d’accéder à private de n’importe où en dehors de cette fonction anonyme?

Si oui, est-il possible de trouver une sorte de bidouille pour accéder à private de l'extérieur, en laissant le code tel quel?

13
steve

Oui, c'est comme ça que Javascript vous permet d'avoir des variables "privées" (cachées dans une portée de fonction).

Non, il n'y a pas de hack disponible pour accéder à des variables telles que private sans réécrire le code.

Les variables définies avec var dans une fonction sont accessibles uniquement à partir de cette fonction.

9
Faiz

D'accord. J? ai compris.

(function(window){
    var alert_original = window.alert;
    window.alert = function(data) {
        window.extracted = data;
        alert_original(data);
    };
})(window);

(function(window){
    var private = 'private msg';
    function sayit() {
    alert(private) // works
 }
 document.body.onclick = sayit; // works
})(window);

Après avoir cliqué sur body, vous pouvez obtenir un 'msg privé' depuis extracted.

6
SangYeob Bono Yu

Ils ne sont pas conçus comme des variables "privées"; c'est comme ça que fonctionnent les fermetures. Vous pouvez faire la même chose en Perl et en Python, à tout le moins, et probablement dans de nombreuses autres langues avec des fermetures et une portée lexicale.

Des débogueurs comme Firebug ou Chrome Inspector peuvent toujours vous montrer la pile entière à tout moment (y compris les variables fermées), mais à part cela et sans changer le code d'origine, je pense que vous n'avez pas de chance.

Peut-être que si tu nous disais ton problème actuel ... :)

1
Eevee

C'est tout l'intérêt d'avoir des variables de portée et privées

Non plus

Définir la valeur privée sur une variable globale?

ou

déclarer la variable dehors

0
gurvinder372