2010-10-22 11 views
9

Biorąc pod następującym JavaScript:JavaScript dostęp do zmiennej lokalnej o tej samej nazwie w wewnętrzne i zewnętrzne Zakres

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? 
    } 
} 

Jak można zmodyfikować identyfikator przekazany do funkcji z zakresu zewnętrznej w wewnętrznym zakresie funkcji?

+0

Wszystkie odpowiedzi w jeden: nie możesz, musisz zmienić nazwę jednego z nich –

Odpowiedz

10

Niestety nie możesz. Poprzez nazwanie parametru w zagnieżdżonej funkcji id, masz cień tego parametru w zewnętrznej funkcji. JavaScript nie zawiera ułatwień dostępu do shadow name. Jedyną opcją jest wybranie innej nazwy dla jednej ze zmiennych.

1

Dlaczego nie możesz zmienić nazwy jednej ze zmiennych?

2

Nie, nie ma. Wewnątrz funkcji nie ma mowy (coś dziwnego w kodzie Mozilli lub ES5 na boku), aby odwoływać się do zakresu jako kontekst w jakikolwiek wyraźny sposób, i nie ma sposobu, aby wspiąć się na łańcuch leksykalny w jakikolwiek bezpośredni sposób.

Dobre pytanie.

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 
    } 
} 

Ale, tak, powinieneś zmienić nazwę jednego z parametrów formalnych.

+0

Na początku myślałem, że to działa, ale nie zadziała, jeśli id ​​jest prymitywny. Ustawienie 'oid =" BLAH "' z funkcji wewnętrznej nie zmieni wartości id. Jeśli byłby to obiekt, zarówno id jak i oid wskazywałyby na ten sam obiekt, co jest prawie pożądanym efektem (nadal nie można zmienić punktu identyfikacyjnego obiektu przez wywołanie 'oid = {a: 1}' –

+0

@Juan Tak, ponieważ id jest ciągiem (zakładam), oznacza to, że moje obejście jest w tym przypadku praktycznie bezużyteczne, więc jedynym rozwiązaniem pozostaje unikanie formalnych parametrów o tych samych nazwach w zagnieżdżonych funkcjach. –

Powiązane problemy