2011-07-20 22 views
5

Czytałem o zawieszeniu JavaScriptu kiedyś z powrotem.Zrozumienie obsługi JavaScriptu i prawdy i fałszu

JavaScript Scoping and Hoisting by Ben Cherry
Two words about “hoisting” by Dmitry Soshnikov

, a niektóre więcej o JavaScript typu przymus, prawdy & fałszywe badania: Truth, Equality and JavaScript i innego zasobu

I podczas uprawiania niektórych, i stwierdził, że jestem brakuje jakiegoś ważnego pojęcia o podnoszeniu i zmiennym "truey & falsy.

1: 'jeśli' test prawdy z duplikatu deklaracji zmiennej

var foo = 1; 
function bar() { 
    if (!foo) { 
    alert('inside if'); 
     var foo = 10; 
    } 

} 
bar(); 

O/P: inside if

Doubt: wartość 'foo' bycia '1', if(!foo) powinny ocenia się false i ten blok nie powinien być wykonywany (cytując z powyższych zasobów: podnoszenie dotyczy tylko deklaracji var , ale nie wykonania). Ale dlaczego ten alert jest wyświetlany. To nie jest przypadek, gdybym bezpośrednio korzystać false (pokazany na poniższym bez-tricków Kod: snippet # 3)

2: 'jeśli' test prawdy bez duplikatu deklaracji zmiennej

var foo = 1; 
function bar() { 
    if (!foo) { 
     alert('inside if'); 
    } 

} 
bar(); 

O/P : brak danych wyjściowych; środki kontrolne nie wszedł 'if' blok
To, co można było oczekiwać

3: 'jeśli' za pomocą 'false' z duplikatu deklaracji zmiennej

var foo = 1; 
function bar() { 
    if (false) { 
     alert('inside if'); 
     var foo = 10; 
    } 
} 
bar(); 

O/P: bez wyjścia; oznacza, że ​​kontrola nie została wprowadzona blok "jeśli"
Oto, czego można się spodziewać:

Ktoś proszę wyjaśnić. Dziękujemy

Odpowiedz

8

Dla Twojej przykład numer 1, alarm jest wyświetlana, ponieważ używasz var wewnątrz funkcji i deklarację var jest podniesiona do góry funkcji, więc jest to odpowiednik:


var foo = 1; 
function bar() { 
    var foo; 
    if (!foo) { 
     alert('inside if'); 
     foo = 10; 
    } 

} 
bar(); 

Można wywnioskować, że tego rodzaju problemy dają wyraźny powód, aby zadeklarować wszystkie zmienne jawnie u góry funkcji.

+2

Moja zła. W ogóle nie miałem nic przeciwko tej funkcji. Koncentruję się tylko na przymusie i dźwiganiu (obracają się w mojej głowie). Jeśli zduplikowana deklaracja nie znajduje się w funkcji, to "foo" będzie miało poprzednią wartość (1) nawet po drugiej deklaracji. To całe myślenie sprawiło, że tęskniłem za używaną funkcją. Dziękuję za otwarcie mojego oka :) – manikanta

+0

Dlaczego nie ma wtedy trzech zadań? jeśli zmienna jest niezdefiniowana, oznacza to jej fałsz? – bill

1

Tylko zmienna deklaracja jest chętnie oceniana. Przypisanie zmiennej w pierwszym przypadku (w bloku if) występuje tylko po wprowadzeniu bloku if.

Zmienna tylko zadeklarować, ale nie przypisać dowolną wartość, ma wartość undefined (co wymusza na false).

+0

Dzięki za odpowiedź. @ Patricka dw i Oboje odpowiedzieliście, że to prawda (w rzeczywistości dziękuję za ignorowanie mojej niewiedzy). Ale mogę tylko przyjąć tylko jedną odpowiedź i jak Pan Patrick odpowiedział pierwszy, zaakceptowałem jego. Nawiasem mówiąc, też podniosłem twoją odpowiedź. Dzięki. – manikanta