2012-03-08 12 views
6

Czy zmienne zdefiniowane są wewnątrz funkcji wewnętrznej, która ma taką samą nazwę jak zmienna w zewnętrznej funkcji odizolowanej od zmiennej zewnętrznej?Zamknięcia JavaScript i nazwa clobbering

function() { 
    var myTest = "hi there"; 
    (function(myTest) { 
     myTest = "goodbye!"; 
    })(); 
    console.log(myTest); // myTest should still be "hi there" here, correct? 
} 

Naturalnie gdybym nie zadeklarowaćmyTest wewnątrz funkcji wewnętrznej byłoby utworzyć zamknięcie i modyfikacji oryginału. Chcę tylko upewnić się, że zmienne zadeklarowane w funkcji wewnętrznej są zawsze odizolowane od tej funkcji, nawet jeśli ich nazwa może kolidować z zewnętrznym zakresem.

Odpowiedz

11

Tak, skutecznie. Każda funkcja tworzy nowy zakres, a najbliższy zakres, w którym zadeklarowana zmienna ma zawsze pierwszeństwo. Żadnych wyjątków. *


* Pośrednie eval

+0

Przez „używane” Rozumiem, że masz na myśli „ogłoszony” poprawne? – devios1

+0

@chaiguy: Tak, przepraszam. Wymieszałem trochę moje słowa. – Ryan

+0

ta metoda pozwala również uniknąć wyszukiwania zakresu. –

1

Tylko dla kompletności wywodu. W tych bardzo podobnych przykładów, tutaj jest to, co się dzieje, bez parametru

var x = 'a'; 
(function() { //note that there is no parameter here 
    x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //b 

i var o tej samej nazwie

var x = 'a'; 
(function() { 
    var x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //a