2011-09-22 11 views
5

Edycja Wygląda na to, że był to problem z mojej strony i mojego używania jsfiddle:?Próba w pełni zrozumienia JavaScriptu podnoszenia

Czytałem ostatnio kilka artykułów o dźwiganiu, jedna to by Nicholas Zakas, a druga to by Ben Cherry.

Im próbuje wykonać przykłady i po prostu sprawdzić na własną rękę, aby upewnić się w pełni zrozumieć to, ale Im mający problem głównie z tego przykładu,

if (!('a' in window)) { 
    var a = 1; 
} 
console.log(a); 

Zamiast rejestrowania undefined jego rejestrowania 1. Jeśli wszystko rozumiem poprawnie, to a powinno być undefined, ponieważ powinien być istniejący w zasięgu okna ze względu na wyciągniętą do góry instrukcję var, więc nie należy jej przypisywać wartości.

Ale dodaje działa zgodnie z oczekiwaniami,

(function bar(){ 
    console.log(foo); 
    var foo = 10; 
    console.log(baz); 
})(); 

foo jest undefined i baz nie jest zdefiniowana. Mam tutaj fiddle z obydwoma przykładami. Naprawdę po prostu próbuję to objąć. Czy coś się zmieniło, skoro te artykuły zostały napisane? Jeśli ktoś może rzucić trochę światła na to, będzie to docenione. Korzystam z Chrome 14 podczas testowania.

+0

biegnę swoje skrzypce w Google Chrome i drukuje 'undefined'. Aby uzyskać dobre wyjaśnienie dotyczące podnoszenia, możesz przyjrzeć się wzorcom * O'Reilly JavaScript *. Istnieje dedykowany ** akapit **. – user278064

+0

Tak, najwyraźniej wynikało to z tego, że nie używam poprawnie jsfiddle doh. – Loktar

Odpowiedz

2

W drugim przykładzie, podnoszący przekształca kod do tego:

(function bar(){ 
    var foo; 
    console.log(foo); 
    foo = 10; 
    console.log(baz); 
})(); 

Więc foo jest niezdefiniowane podczas pierwszego zaproszenia do zalogowania . Deklaracja jest zawsze podnoszona do górnej części funkcji zamykającej, ale przydział nigdy nie jest podnoszony.

+0

Myślę, że zrobiłeś literówkę. – pimvdb

+0

tak, mały – dtanders

1

object.a === undefined; // true, ale a in object; // true

var object = {a: undefined}; 

('a' in object); // is true because a is a property of object 
2

Masz JSFiddle ustawiony onLoad, więc var a jest zawężona do funkcji onLoad. Zmień go no wrap i masz:

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

podnoszący jest rozumiane inaczej, ale do mojego zrozumienia co robi jest

Ilekroć utworzyć zmienne/funkcje ustawia się przestrzeń pamięci dla you.It nie umieść zmienną/funkcje w górnej części kontekstu wykonania.

Wpisz "ten/okno" w konsoli, gdzie znajdziesz war/funkcje, które leżą obok.

na przykład:

a; //returns undefined 
b(); //returns Hello World 
var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 

Jeśli jest umieszczona na górze w trakcie realizacji to powinno wyjście „Hello” nie działa „niezdefiniowane” dostanie excuted.Variables nie będzie się excuted. Należy unikać podnoszenia excute vars po to jest oświadczył:

var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 
a; //returns Hello 

b(); //returns Hello World 
Powiązane problemy