2009-08-03 4 views
3

J'essaie de définir une fonction qui peut accéder aux variables qui sont dans la portée de la fonction qui l'appelle. (J'essaye de construire un formateur de chaîne qui est plus joli que "a" + b, et plus concis que String.format ("a {0}", b). Donc je peux obtenir SF ("a { b} "), et je ne sais pas s'il est possible)Accéder aux variables javascript à partir de la portée de l'appel

si

 
function magic(str) { 
    return parentScope[str]; // or return eval(str); 
    // or something like that 
} 

function call() { 
    var a = 1; 
    alert(magic("a")); 
} 
call(); 

alerterait "1".

actuellement je peux le faire en ayant le code de retour de la fonction à être évalué, mais il semble qu'il doit y avoir une meilleure façon.

+0

Il y avait un « arguments.caller » et je pense qu'une « arguments.callee.caller » pour obtenir au parent, mais la mise en œuvre est browser- dépendante et de plus en plus hors de la faveur. Je pense que même les arguments.callee pourraient finir par être obsolètes. Le mieux est de rester loin de tout ça. – Nosredna

Répondre

2

Il suffit de mettre votre fonction « magique » dans la fonction d'appel:

function call() { 
    function magic(str) { 
     return a; 
    } 

    var a = 1; 
    alert(magic()); 
} 
call(); 

Ce mécanisme dans les coulisses est appelé fermetures et qui sont concept très puissant. Pensez simplement à une requête AJAX où la fonction de rappel peut toujours accéder aux variables locales de la fonction appelante.

MISE À JOUR

j'ai mal compris votre question. La chose que vous voulez réellement construire est impossible à implémenter en JavaScript car il n'y a aucun moyen d'accéder à la portée de l'appelant.

MISE A JOUR 2

Voici ma chaîne fonction de formatage. Pas aussi concis que vous pouvez le vouloir, mais toujours très utilisable.

String.prototype.arg = function() 
{ 
    result = this; 

    // This depends on mootools, a normal for loop would do the job, too 
    $A(arguments).each((function(arg) 
    { 
     result = result.replace("%", arg); 
    }).bind(this)); 

    return result; 
} 

Vous pouvez l'utiliser comme:

"%-% %".arg(1,2).arg(3) 

et recevoir

"1-2 3" 
+0

Je ne pense pas que cela aide compte tenu du contexte de la question - il cherche à tirer des noms de variables arbitraires sur une chaîne basée sur le formatage. – annakata

0

Pour autant que je sais qu'il est impossible d'atteindre et de saisir une variable arbitraire d'une fonction javascript . D'un objet oui, mais pas d'une méthode d'exécution.

Je ne peux pas penser à une méthode de fonction (appliquer, appeler, sinon) qui vous aide ici: franchement, je pense que vous essayez trop pour un avantage marginal sur la chaîne normale. Format, format ... .

0

@sebasgo est correct, vous ne pouvez pas faire exactement ce que vous essayez de faire. Mais je pensais que vous aimeriez voir la méthode de Prototype String.interpolate:

"#{animals} on a #{transport}".interpolate({ animals: "Pigs", transport: "Surfboard" }); 
//-> "Pigs on a Surfboard" 

var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/; //matches symbols like '<%= field %>' 
var html = '<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>'; 
html.interpolate({ name: 'John Smith', age: 26 }, syntax); 
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div> 
Questions connexes