2010-02-04 11 views
0

Je suis en train de définir une variable dynamique au sein d'une fonction JavaScript Rhino (en particulier ce qui est intégré dans Java 6), mais je ne veux pas recourir à eval, et je ne vouloir avoir à le référencer via cela. Au fond, je veux prendre un objet, et transformer chaque propriété dans un var dans le cadre d'une fonction ... quelque chose comme:JavaScript Rhino et la portée dynamique var création

var abc = "value"; 
var context = { abc: 123, xyz: "def" }; 

function test(cx) { 
    for (var p in cx) { 
    this_scope[p] = cx[p]; 
    } 

    println(abc); 
    // DON'T WANT TO HAVE TO DO THIS: 
    // pritnln(this.abc); 
} 

test(context); // prints: 123 
println(abc); // prints: value 

Croyez-le ou non, il est significatif si je dois utiliser « cette " (C'est une fonction générée dynamiquement que je veux invoquer encore et encore avec différents objets de contexte et en utilisant "ceci" pour chaque variable serait très nuisible).

Je veux aussi éviter d'avoir à saisir un nouveau contexte de moteur ou quelque chose comme ça ... ce serait superbe si je peux le faire directement en JavaScript (je pense que le résultat serait beaucoup plus rapide).

+1

Est-ce que cette portée est vraiment dynamique comme le suggère le titre ou quelque chose d'entièrement différent? Pour moi, la portée dynamique signifie faire référence aux liaisons d'environnement de l'appelant. C'est dynamique parce que ce qui est lié dépend du flux d'exécution du programme. Faire des noms raccourcis pour les noms qui sont déjà visibles dans une portée statique semble être une chose différente. – Anonymoose

Répondre

3

Donc, fondamentalement, vous voulez quelque chose qui fonctionne comme JS de with? * Grins, canards, et des pistes *

var abc = "value"; 
var context = {abc: 123, xyz: "def"}; 

function test(cx) { 
    with (cx) { 
     println(abc); 
    } 
} 

test(context); 
println(abc); 

Rappelez-vous, certains praticiens JS bien connus, comme Doug Crockford, strongly deprecate the use of with.

+0

c'est PRECISEMENT ce que je cherchais ... (je me sens stupide maintenant) –

+0

Soyez sûr de prendre en compte les mauvais aspects de 'with', c'est-à-dire, de définir une propriété qui n'existe pas sur la portée actuelle, fait ne le place pas sur la portée 'with', il se positionne sur la portée globale. http://jsfiddle.net/EJM6X/ –

+1

+1 pour * grimacer, esquiver et courir * après avoir suggéré l'utilisation de 'avec '. –