2016-08-25 15 views
5

To pytanie dotyczy o tej samej nazwie funkcji i zmiennej. Proszę mi powiedzieć - dlaczego tego kodu nie ma błędów:Nazwa zmiennej jest jak nazwa funkcji - kiedy powoduje błąd/kiedy nie jest

var Task = new Task(); 
 
     
 
    function Task() { 
 
     console.log('work!'); 
 
    }

ale ten nie będzie działać:

start(); 
 
    
 
function start() { 
 
    var Task = new Task(); 
 
}; 
 
    
 
function Task() { 
 
    console.log('work!'); 
 
} 
 

Dlaczego to jest tak?

+7

Myślę, że spadki są tu trochę niższe - nie jest od razu oczywiste, dlaczego zmieniona przez rekrutację zmienna 'Task' działa poza funkcją, ale nie w środku. –

+0

Zadanie nie znajduje się w środowisku wykonawczym po wywołaniu polecenia start. Więc nie zostało jeszcze zdefiniowane. W pierwszym przykładzie zadanie jest podnoszone. W drugim przykładzie start jest nazywany pierwszym, więc Zadanie nie istnieje jeszcze –

+3

@SterlingArcher Pewne, że tak. Kwestią jest zakres i podnoszenie. Nie mam teraz czasu, aby przejść do pełnej odpowiedzi teraz ... –

Odpowiedz

6

Poprzez nazwy podnośnikowego, pierwszym kod zasadniczo działa tak:

var Task; // (undefined) 

Task = function() { 
    console.log('work!'); 
}; 

Task = new Task(); 

Twój drugi tak:

var start, Task; 

start = function() { 
    var Task; // (undefined) 
    Task = new Task(); 
}; 

Task = function() { 
    console.log('work!'); 
}; 

start(); 

Jak widać, Task jest przesłonięta przez undefined wewnątrz funkcja start. Nie dzieje się tak, gdy funkcja i definicja zmiennej są w tym samym zakresie, ponieważ wtedy var i function są w zasadzie tym samym.

Jeśli pominiesz var wewnątrz start, działa również.

+4

Podałem podobną odpowiedź, ale bardzo ją lubię. –

+2

Ten artykuł może być również dobrą lekturą: http://adripofjavascript.com/blog/drips/variable-and-function-+isting –

+0

fajna odpowiedź - wielkie dzięki! – qwe

-2

Ma to związek ze zmiennymi globalnymi i lokalnymi.

Zmienne zdefiniowane w funkcji są lokalne.
Zmienne zdefiniowane nie w funkcji są globalne.
I wszystkie funkcje w obecnej klasie, jeśli je masz, mogą korzystać ze zmiennej globalnej

Powiązane problemy