2009-07-13 19 views
8

Básicamente se trata de una cuestión de cómo acceder al controlador de ámbito local. Estoy tratando de lograr algo similar para la definición de variable global como:variable local de Javascript declarar

window['newObject'] = "some string"; 
alert(newObject); 

pero para alcance local. En este momento la única solución que tengo es que utilizan evals:

eval("var newObject='some string'"); 

pero esto es realmente una solución fea ... La mejor uno sería como usar alguna referencia al ámbito local como en una solución de ventana [], pero nunca oí de cualquier referencia al alcance local ... ¿Alguna idea?

Ejemplo va aquí:

function x(arg) 
{ 
    localScope[arg.name]=arg.value; 
    alert(sex); 
} 

x({name:"sex", value:"Male"}); 
+0

veo, que quiere decir es que hay un Javascript equivalente a "la variable" de php. http://www.php.net/manual/en/language.variables.variable.php –

+0

Posible duplicado de [JavaScript: obtenga la variable local dinámicamente por el nombre de la cadena] (http://stackoverflow.com/questions/1920867/javascript -get-local-variable-dynamically-by-name-string) –

Respuesta

1

Okey He encontrado una pregunta relacionada que está hablando de lo que necesito ...

How can I access local scope dynamically in javascript?

Sólo recuerdo que, en ECMA 262 es sólo una manera de añadir las variables dinámicamente locales de alcance utilizando "with" (y eval por supuesto), he aquí la solución:

var x=function(obj) 
{ 

    with(obj) 
    { 
     alert(someObj); 
    } 
} 
alert(typeof someObj); 


x ({someObj:"yea"}) ; 

alert(typeof someObj); 
+1

Lo único que le ofrece este bloque 'with' es que no tiene que escribir' alert (obj.someObj) '.A expensas de agregar tres líneas adicionales de código. –

+1

"con" es algo malo de usar. Consulte http://www.yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/ y https://developer.mozilla.org/En/Core_JavaScript_1.5_Guide/Object_Manipulation_Statements –

+0

Sí, ambos esos problemas: la legibilidad y el acceso al alcance local un poco más lento es asequible con el sistema de templatings que necesito crear. – Wilq32

1

Debo estar perdiendo algo. ¿Qué es lo que quiere diferente de simplemente hacer:

var newObject = 'some string'; 

? (OP ha aclarado la pregunta)

No creo que haya una manera de hacer lo que está pidiendo. Use miembros de un objeto local, p.

function doSomething(name, value) 
{ 
    var X = {}; 
    X[name] = value; 
    if (X.foo == 26) 
    alert("you apparently just called doSomething('foo',26)"); 
} 

Si elige una variable 1-personaje como $ o X, se "costos" encontrado 2 caracteres (nombre de variable más un punto), y evita tratar de usar eval o haciendo algo raro.

+0

Sí - Quiero hacer eso de forma dinámica en correspondencia con los datos que recibo para esta función. – Wilq32

+0

Quiero decir, sí, te pierdes algo allí. Necesito una variable local de definición dinámicamente;) – Wilq32

0

Pregunta interesante, nunca pensé en algo como esto. Pero, ¿cuál es el uso?

La razón por la que querría hacer algo como esto, es si no conoce el nombre de la variable. Pero luego, en ese caso, la única forma de acceder a la variable nuevamente sería utilizando el mismo objeto de referencia. Es decir. solo podría usar cualquier objeto antiguo para almacenar datos.

La lectura de un objeto de referencia de este tipo sería interesante para la depuración, pero no veo por qué querría escribir en ella.

Editar:

El ejemplo informados no convencerme de la necesidad de acceso al ámbito local, ya que todavía tiene el nombre sex codificado en la alerta. Esto podría implementarse como:

function x(arg) 
{ 
    container = {}; 
    container[arg.name] = arg.value; 
    alert(container.sex); 
} 

¿Podría dar más detalles sobre el ejemplo?

+0

El ejemplo no es convincente de que esto sea necesario. Trabajar en el sistema de plantillas y explicar por qué necesito eso tomaría mucho tiempo y sería realmente complicado :) – Wilq32

+0

Solo necesito poder llamar (alerta (sexo)) donde el nombre de la variable puede tomarse de una fuente externa;) – Wilq32

+0

Ah, ¿a qué se debe que su plantilla de sistema no permita puntos en cajas de alertas? ;-) De lo contrario, 'alert (obj.someObj)' solo funciona. –

1

¿Por qué no crear un objeto en el ámbito local y luego usarlo como un contenedor para las variables que desea crear dinámicamente?

function x(arg) 
{ 
    var localSpace = {}; 
    localSpace[arg.name] = arg.value; 
} 
+0

Pero necesito poder referirme al elemento como un nombre solamente, no con localSpace [nombre] antes de cada variable ... – Wilq32

+0

¿por qué es eso un requisito? –

+0

porque a los terceros les gustaría referirse en las plantillas a sus propios valores desde el ámbito local ... bien explicar esto es realmente complicado, pero puedo asegurar que no hay otra forma de hacerlo solo teniendo el alcance local extendido (o global) pero con un acceso más largo a las variables). – Wilq32

-1

No estoy del todo seguro de entender tu pregunta. Al crear una clase X, por lo general hago esto:

function x(args) { 
    var _self = this; 

    _self.PriviledgedMethod(a) { 
     // some code 
    } 

    function privateMethod(a) { 
     // some code 
    } 
} 

var newObject = new x(args); 

Puede seguir teniendo acceso a _self y argumentos ya que está cerrado por las funciones contenidas.

+0

evite la evaluación a toda costa (a veces no puede). al evitarlo, permitirá mejores posibilidades de minificación. –

+0

Pido algo completamente diferente - cómo crear dinámicamente variables en el ámbito local - que puede escribir alerta (sexo) donde 'sexo' se crea dinámicamente en el alcance local – Wilq32

1

puede probar con el llamado argumentos truco
EDIT: Esto no es el navegador cruz

function x({sex:sex, height:height}) { 
    alert(sex); 
    alert(height); 
} 

x({ sex: 'male', height: 'short' }); 
x({ height: 'medium', sex: 'female' }); 

// male 
// short 
// female 
// medium 
+0

intrigante ... es este ECMAscript, o simplemente un dialecto particular ? (por ejemplo, Spidermonkey ya que parece funcionar con Spidermonkey 1.7) –

+0

Interesante ... Agrego +1 :) – Wilq32

+0

Esto es parte de JS1.7 y se llama asignación de desestructuración. Puede simplificar esta declaración de función para: function x ({sex, height}) {...} – Prestaul

6

Lo que estamos buscando se llama el objeto llamada. Pero de acuerdo con this, no puede acceder directamente, por lo que no tiene suerte.

+0

Nunca escuché el término _call object_ antes, pero el enlace que proporcionaste fue útil . Parece un detalle de implementación de JavaScript para describir el alcance local de una función (que puede escapar del alcance "local" al capturarse en un cierre). Sin embargo, no creo que esto tenga mucho que ver con la pregunta original. –

+0

Pensándolo bien, si pudieras acceder directamente a los detalles de implementación, sería relevante para la pregunta, por lo que tienes razón en ese aspecto. –

+0

Derecha; si pudiera, podría hacer lo que está pidiendo: "localScope [name] = value;" –

1

No estoy seguro de lo que necesita exactamente, pero aquí está mi 2 centavos.

La única manera de crear dinámicamente vars en una función existente es el método eval que ya ha mencionado.

Otra opción (mencionado por otros) es que su función de tomar un mapa de contexto, y la plantilla de acceso con la notación de puntos (context.var1)

Mi sugerencia final es el constructor de funciones. Pero tengo la sensación de que esto es lo que estás buscando. (Tenga en cuenta que el constructor función adolece de los mismos problemas que una llamada eval)

var arg1 = "first"; 
var arg2 = "last"; 

// This is the body of the function that you want to execute with first 
// and last as local variables. It would come from your template 
var functionBody = "alert(first + ' ' + last)"; 

var myCustomFun = new Function(arg1, arg2, functionBody); 

myCustomFun("Mark", "Brown"); // brings up and alert saying "Mark Brown"; 

creo que sirve

Cuestiones relacionadas