223 votes

Obtenir toutes les Variables dans la portée

Est-il possible d’obtenir toutes les variables qui sont actuellement dans la portée en javascript ?

128voto

iman Points 402

Bien que tout le monde répondre "Non" et je sais que "Non" est la bonne réponse mais si vous avez vraiment besoin pour obtenir les variables locales d'une fonction il y a une manière limitée.

Prenons cette fonction:

var f = function() {
    var x = 0;
    console.log(x);
};

Vous pouvez convertir votre fonction d'une chaîne de caractères:

var s = f + '';

Vous obtiendrez source de la fonction en tant que chaîne

'function () {\nvar x = 0;\nconsole.log(x);\n}'

Maintenant, vous pouvez utiliser un parser comme esprima à la fonction d'analyse de code et à trouver les déclarations de variables.

var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';
s = s.slice(12); // to remove "function () "
var esprima = require('esprima');
var result = esprima.parse(s);

et trouver des objets avec:

obj.type == "VariableDeclaration"

dans le résultat (j'ai enlevé console.log(x) ci-dessous):

{
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "x"
                    },
                    "init": {
                        "type": "Literal",
                        "value": 0,
                        "raw": "0"
                    }
                }
            ],
            "kind": "var"
        }
    ]
}

J'ai testé ce dans Chrome, Firefox et Nœud.

Mais le problème avec cette méthode est que vous avez juste les variables définies dans la fonction elle-même. Par exemple pour celui-ci:

var g = function() {
    var y = 0;
    var f = function() {
        var x = 0;
        console.log(x);
    };
}

vous venez d'avoir accès à l' x et pas y. Mais encore, vous pouvez utiliser des chaînes de l'appelant (arguments.le destinataire de l'appel.de l'appelant.de l'appelant.l'appelant) dans une boucle pour trouver les variables locales de la fonction appelante. Si vous avez tous les noms de variables, de sorte que vous avez portée des variables. Avec les noms de variable, vous avez accès à des valeurs avec un simple eval.

89voto

T.J. Crowder Points 285826

Pas de. "Portée", les variables sont déterminées par la "portée de la chaîne", ce qui n'est pas accessible par programmation.

Pour les détails (beaucoup d'elle), vérifiez l'ECMAScript (JavaScript) de la spécification. La spécialisation actuelle est un peu de douleur de lien (qui sera fixée dans les prochains mois), mais si vous suivez ce lien , puis de prendre la dernière tc39-xxxx-xxx.fichier pdf, c'est la plus récente (tc39-2009-050.pdf de cette écriture). (La spec a été finalisé et publié aujourd'hui.) Voici un lien vers la page officielle où vous pouvez télécharger les canonique spec (format PDF), et voici l'une de l'officiel, linkable format HTML.

Mise à jour basé sur votre commentaire Camsoft

Les variables dans la portée de votre événement, de la fonction sont déterminés par l'endroit où vous définissez votre fonction d'événement, pas comment ils l'appellent. Mais, vous pouvez trouver des informations utiles à propos de ce qui est disponible à votre fonction via this et arguments par faire quelque chose le long des lignes de ce que KennyTM souligné (for (var propName in ____)) depuis que vous dira ce qui est disponible sur les différents objets qui vous sont fournis (this et arguments; si vous ne savez pas quels sont les arguments qu'ils vous donnent, vous pouvez trouver par le biais de l' arguments variable qui est implicitement défini pour chaque fonction).

Donc, en plus de tout ce qui est en-champ d'application en raison de l'endroit où vous définissez votre fonction, vous pouvez trouver de quoi d'autre est disponible par d'autres moyens en faisant:

var n, arg, name;
alert("typeof this = " + typeof this);
for (name in this) {
    alert("this[" + name + "]=" + this[name]);
}
for (n = 0; n < arguments.length; ++n) {
    arg = arguments[n];
    alert("typeof arguments[" + n + "] = " + typeof arg);
    for (name in arg) {
        alert("arguments[" + n + "][" + name + "]=" + arg[name]);
    }
}

(Vous pouvez développer que pour obtenir les informations les plus utiles.)

Au lieu de cela, cependant, je serais probablement utiliser un débogueur comme google Chrome, outils de dev (même si vous n'avez pas l'habitude d'utiliser google Chrome pour le développement) ou Firebug (même si vous n'avez pas l'habitude d'utiliser Firefox pour le développement), ou Libellule sur l'Opéra, ou "les Outils de développement F12" sur IE. Et de lire ce que les fichiers JavaScript ils vous offrent. Et de les battre sur la tête pour un bon docs. :-)

33voto

Justin Johnson Points 16243

Oui et non. "Non" dans presque toutes les situations. "Oui", mais seulement de manière limitée, si vous voulez vérifier la portée globale. Prenons l'exemple suivant:

var a = 1, b = 2, c = 3;

for ( var i in window ) {
    console.log(i, typeof window[i], window[i]);
}

Les sorties qui, parmi les 150+ d'autres choses, les éléments suivants:

getInterface function getInterface()
i string i // <- there it is!
c number 3
b number 2
a number 1 // <- and another
_firebug object Object firebug=1.4.5 element=div#_firebugConsole
"Firebug command line does not support '$0'"
"Firebug command line does not support '$1'"
_FirebugCommandLine object Object
hasDuplicate boolean false

Donc, il est possible de faire la liste des variables dans la portée actuelle, mais il n'est pas fiable, concis, efficace, ou facilement accessible.

Une meilleure question est: pourquoi voulez-vous savoir quelles sont les variables dans la portée?

16voto

CMS Points 315406

Tu ne peux pas.

Les variables, identifiants des déclarations de fonction et arguments du code de fonction, sont liés en tant que propriétés de l' objet variable , ce qui est inaccessible.

Voir également:

8voto

Timothy Perez Points 6379

La Façon la plus Simple d'Obtenir l'Accès à Vars dans un Champ d'action Particulier

  1. Ouvrir les Outils de développement > Ressources (sous Chrome)
  2. Ouvrir le fichier avec une fonction qui a accès à ce champ d'application (conseil cmd/ctrl+p pour trouver le fichier)
  3. Définir un point d'arrêt à l'intérieur de cette fonction et exécuter votre code
  4. Quand il s'arrête à votre point d'arrêt, vous pouvez accéder à la portée de la var par le biais de la console (ou de la portée de la var de la fenêtre)

Remarque: Vous voulez faire cela, à l'encontre de l'onu-minifiés js.

La Façon la plus Simple pour Afficher Tous les Non-Privé Vars

  1. Ouvrez la Console (Chromé)
  2. Type: cette.fenêtre
  3. Appuyez Sur Entrée

Maintenant, vous allez voir un arbre d'objets que vous pouvez étendre à déclarer tous les objets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X