2013-01-09 16 views
11

Running to w Chrome i Firefox daje różne odpowiedzi:JavaScript podnoszący w Chrome i Firefox

(function() { 

     if(true) { 
      function f() { alert("yes"); }; 
     } else { 
      function f() { alert("no"); }; 
     } 
     f(); 

    })(); 

W Chrome wynik brzmi 'nie' W Firefoksie wynik brzmi 'tak'

Dlaczego różnicę ?

Odpowiedz

12

Deklarowanie funkcji w instrukcjach warunkowych jest niestandardowe, więc nie należy wykonywać tego . To znany problem. Możesz używać wyrażeń funkcyjnych zamiast deklaracji:

var f; 
if(true) { 
    f = function() { alert("yes"); }; 
} else { 
    f = function() { alert("no"); }; 
} 
f(); 

famous Kangax article on function expressions daje pewne dodatkowe informacje:

FunctionDeclarations są dozwolone tylko do stawienia się w Programu lub FunctionBody. Składniowo, oni nie może pojawić się w Bloku({ ... }) - taki jak ten z if, while lub for wypowiedzi. To dlatego Bloki może zawierać tylko Stwierdzenia, nie SourceElements, które FunctionDeclaration jest.

Ten sam artykuł mówi:

Warto wspomnieć, że zgodnie ze specyfikacją, implementacje mogą wprowadzać rozszerzenia składni (patrz punkt 16), jednak nadal być w pełni Conforming. Dokładnie tak jest w przypadku wielu klientów. Niektóre z nich interpretują deklaracje funkcji w blokach jako dowolne inne deklaracje funkcji - po prostu podnosząc je do górnej części otaczającego zakresu; Inne - wprowadzają inną semantykę i podążają nieco bardziej skomplikowanymi zasadami.

5

Od V8 (silnik JavaScript Chrome) bug tracker:

nie błąd. Firefox jest jedyną przeglądarką, która robi to, czego oczekujesz.

Zachowanie Safari i IE w tym przypadku jest takie samo jak w przypadku Chrome/V8.

2

Dzieje się tak ze względu na brak Firefox funkcja podnoszenia, jak pomyślany w ECMAScript 5.

chrom prawidłowo przypisuje się wartość f() przed wykonaniem funkcji ciała, więc pierwszą wersję f() jest zastępowany przez drugi.

SpiderMonkey (silnik JavaScript Firefoksa) uruchamia kod bez wstępnego assignin wartość do f(), tak używa tylko wartość, która napotka na swej drodze: function f() { alert("yes"); };

Co znajduje się funkcja podnoszący?
Zakres funkcji JavaScript oznacza, że ​​wszystkie zmienne zadeklarowane w funkcji są widoczne w całym ciele funkcji . Co ciekawe, oznacza to, że zmienne są widoczne nawet przed ogłoszeniem. Ta cecha JavaScriptu jest nieformalnie nazywana podnoszeniem: Kod JavaScript zachowuje się tak, jakby wszystkie deklaracje zmiennych w funkcji (ale nie wszystkie przypisane przypisania ) były "podnoszone" do górnej części funkcji.

źródła:
http://statichtml.com/2011/spidermonkey-function-hoisting.html
2011 - O'Reilly - JavaScript - The Definitive Guide 6. edycji

Powiązane problemy