2010-10-22 9 views
9

Dada la siguiente JavaScript:variable de JavaScript acceso local con el mismo nombre en el interior y exterior Ámbito

var someFunction = function(id) { 
    //do some stuff 
    var modifyId = function(id) { 
    //do some stuff 
    outer.id = id; //is there any way to modify the id variable in the outer scope from here? 
    } 
} 

¿Cómo modificar el identificador pasado en el ámbito de la función externa desde dentro del ámbito de la función interior?

+0

Todas las respuestas en una: no se puede, tiene que cambiar el nombre de una de ellas –

Respuesta

10

Lamentablemente no se puede. Al nombrar el parámetro en la función anidada id, ha sombreado el parámetro en la función externa. Javascript no contiene ninguna función para acceder al nombre sombreado. La única opción es elegir un nombre diferente para una de las variables.

1

¿Por qué no puedes cambiar el nombre de una de las variables?

2

No, no lo hay. Desde dentro de una función, no hay forma (algo raro en el código de Mozilla o ES5 a un lado) de referirse al alcance como un contexto de manera explícita, y no hay forma de escalar la cadena de alcance léxico de ninguna manera directa.

Buena pregunta sin embargo.

1
var someFunction = function(id) { 
    //do some stuff 
    var oid = id; 
    var modifyId = function(id) { 
    //do some stuff 
    // you can access the outer id via the oid variable 
    } 
} 

Pero, sí, simplemente debería cambiar el nombre de uno de los parámetros formales.

+0

Al principio pensé que esto funcionó, pero no funcionará si id es una primitiva. Establecer 'oid =" BLAH "' desde la función interna no cambiará el valor de id. Si fuera un objeto, id y oid apuntarían al mismo objeto, que es casi el efecto que deseas (aún no pudiste cambiar a qué objeto apunta identificando al invocar 'oid = {a: 1}' –

+0

@Juan Sí. Dado que id es una cadena (supongo), eso significa que mi solución alternativa es bastante inútil en este caso. Por lo tanto, la única solución es evitar los parámetros formales con los mismos nombres en las funciones anidadas. –

Cuestiones relacionadas