Est-il possible d’obtenir toutes les variables qui sont actuellement dans la portée en javascript ?
Réponses
Trop de publicités?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.
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. :-)
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?
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:
La Façon la plus Simple d'Obtenir l'Accès à Vars dans un Champ d'action Particulier
- Ouvrir les Outils de développement > Ressources (sous Chrome)
- Ouvrir le fichier avec une fonction qui a accès à ce champ d'application (conseil cmd/ctrl+p pour trouver le fichier)
- Définir un point d'arrêt à l'intérieur de cette fonction et exécuter votre code
- 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
- Ouvrez la Console (Chromé)
- Type: cette.fenêtre
- Appuyez Sur Entrée
Maintenant, vous allez voir un arbre d'objets que vous pouvez étendre à déclarer tous les objets.