2015-07-15 12 views
5

Miałem do czynienia z dokumentami JavaScript var hoisting, Tam w sekcji znalazłem Initialization of several variables z Example podaną poniżej.Dlaczego inicjalizacja wielu zmiennych prowadzących do wycieku zakresu?

var x = 0; 

function f(){ 
    var x = y = 1; 
} 
f(); 

console.log(x, y); // outputs 0, 1 
// x is the global one as expected 
// y leaked outside of the function, though! 

Gdzie mogę uzyskać wyjątek jako Uncaught Reference Error: y is not defined. ale to się nie dzieje z powodu wycieku Scope i wyświetla się 0,1.

Czy mogę wiedzieć, dlaczego tak się dzieje i co sprawiło, że tak się stało. Wreszcie wszelkie problemy związane z wydajnością?

+0

możliwe duplikat [Czy ustawienie wielu zmiennych w 1 linii obowiązują w javascript? (var x = y = 'value';)] (http://stackoverflow.com/questions/7581439/zestawienia-wielokrotne-zmiany-w1-line-valid-in-javascript-var-xy-value) –

+1

To nie jest pytanie związane z możliwościami 'inicjalizacji wielu zmiennych' ale zmiennymi' Scope' zmienia @torazaburo. –

+0

Dokładniej przeczytaj proponowany duplikat. –

Odpowiedz

7

Nie deklarujesz y.

var x = y = 1; 

jest równoważna

y = 1; 
var x = y; // actually, the right part is precisely the result of the assignement 

undeclared variable is a global variable (chyba, że ​​jesteś w strict mode, to jest to błąd).

Przykład, o którym mówisz, był inny, był przecinek, który .

Można naprawić swój kod w

var y=1, x=y; 
+0

W rzeczywistości oryginalny kod jest równoważny "y = 1; var x = 1; '. Jeśli 'y' nie może być przypisane do 1 z jakiegokolwiek powodu,' x' będzie nadal równe 1. Zobacz http://stackoverflow.com/a/31414927/3903374 –

+0

@RickHitchcock Dokładniej, jest to wartość (y = 1) wyrażenie. Powiedzenie, że jest to 1, jest równoznaczne z powiedzeniem, że jest y. –

+1

Poprawnie w tym przypadku, ale takie było założenie w moim połączonym poście, które było nieprawidłowe w tej instancji. Jeśli "y" zostało wcześniej zadeklarowane jako 'const' 2,' x' nie * nie * jest równe 2. –

Powiązane problemy