2012-02-13 19 views
7

Nie robiłem poważnego programowania JavaScript od pewnego czasu i piszę wstępny przewodnik po języku dla niektórych moich kolegów. Chciałbym omówić najlepsze praktyki pętli, ale jest jeden drobny szczegół, który trzymałem w tyle mojej głowy:JavaScript "dla (var i = 0; ...) {...}" niezgodności przeglądarki?

Podczas zapętlenia nad tablicami pamiętam następujący wzór, który nie jest bezpieczny w użyciu, ponieważ istnieją poważne przeglądarek, które nie obsługują go:

for (var i = 0; i < ls.length; i++) { ... } 

Zamiast słowa kluczowego var musi być przeniesiony z tablicy, takie jak:

var i; 
for (i = 0; i < ls.length; i++) { ... } 

Czy jest to prawidłowe? Przeszukałem sieć i nie mogę tego potwierdzić. Czy niektóre stare przeglądarki nie obsługują pierwszej metody? Jeśli nie, to które nie?

+3

Ja osobiście nie mogę wymyślić żadnej przeglądarki, w której pierwszy przykład mógłby się nie udać. –

+1

Brak powszechnie używanych przeglądarek w 2012 r. Nie obsługuje żadnego z nich. Są dokładnie takie same. (Kiedy mówię "powszechny użytek" mam na myśli użycie więcej niż jednego lub dwóch oddalonych przypadków, może ktoś gdzieś pracuje z Netscape 3 gdzieś, ale dostajesz obraz, a Netscape 3 prawdopodobnie działał.) – Pointy

+0

ile masz lat? Czy mówimy o Netscape i IE3, czy też odnosimy się do ram czasowych IE7? – webdad3

Odpowiedz

12

"Czy to prawda?"

O ile nie mówimy o naprawdę starej przeglądarce, nie mam pojęcia o takim problemie z dzisiejszymi przeglądarkami.


The issue tylko ludzie mogą mieć w pierwszym przykładzie jest to, że może to zmylić kogoś do myślenia, że ​​JavaScript ma bloku zakres, które nie zmieniły się od To ES6, który ma zasięg blokowy .

W obu przykładach zmienna i będzie obejmowała zakres do otaczającej zmiennej środowiska, niezależnie od tego, czy otoczenie jest funkcją, czy środowisko globalne.

7

Zamiast słowa kluczowego var musi być przeniesiony z tablicy

Niekoniecznie. Chodzi o to, że NIE powinieneś zapomnieć słowa kluczowego var przed i inaczej zmieni się w globalną zmienną. Tak to jest w porządku, jeśli nie:

for (var i = 0; i < ls.length; i++) { ... } 

Można poprawić wydajność powyższego kodu przez tworząc zmienne, które głosi, że długość tablicy/kolekcji, zamiast czytania go ponownie i ponownie z każdej iteracji:

for (var i = 0, len = ls.length; i < len; i++) { ... } 

BTW nie martw się o przeglądarce, że pętla powinna działać w różnych przeglądarkach :)

+0

Poza tematem, ale nie po raz pierwszy słyszałem, że przechowywanie długości w zmiennej jest ważną optymalizacją. Co robi przeglądarka pod maską? Myślę, że. Długość powinna być stałym sprawdzeniem czasu, a nie czymś, co oblicza się kiedykolwiek. – thebossman

+2

@thebossman: W JavaScript wszystko jest przedmiotem. W pętli używana tablica jest również obiektem. Podczas gdy w pętli jego wartość jest odczytywana ponownie i ponownie przy każdej iteracji, np. JS uzyskuje dostęp do właściwości tablicy z każdą iteracją, która zajmuje więcej czasu niż utworzenie zmiennej i przypisanie jej długości. Oczywiście dla większości użytkowników i aplikacji nie stanowi to problemu, ale w przypadku aplikacji zorientowanych na wydajność lub masywnych staje się kluczowym krokiem. – Sarfraz

+0

@thebossman: Tak, ale musisz często sprawdzać. Przechowywanie w zmiennej lokalnej oznacza jeszcze szybszy dostęp. –

0

Zakładając, że nie obsługujesz żadnych przeglądarek starszych niż IE6, nie powinno to stanowić problemu.

+0

Nie w IE 3.02 ani Netscape 2.0 – mplungjan

0

Nie, że poprosił o to, ale można użyć jQuery to zrobić w następujący sposób:

$.each(ls, function(i,value){ 
... 
}); 
0

JavaScript rzeczywiście deklaruje zakres poziom funkcji nie blokuje zakres. Zdeklarowane zmienne są podnoszone do szczytu ich funkcji. Mówię tylko, że twoje przykłady są identyczne.Nawet w przypadku słowa kluczowego var w ramach instrukcji for zmienna i będzie dostępna poza pętlą.

Jedyna rzecz, na którą trzeba zwrócić uwagę, to jeśli pominiesz var zmienna będzie globalna, a nie ograniczona do funkcji.

0

zderzyłem się tym dzisiaj

for(var i=0; i < t; i++) { 
//do whatever 
} 

mój JScript był w pliku XSL nazwie z pliku html - pracował dobrze w IE, ale nie w innych przeglądarkach - kod będzie katastrofy i nic wyświetlane

szczęście mogę go zmienić, który pracował dla wszystkich testowanych przeglądarkach

for(var i=0; i != t; i++) { 
do whatever} 

być również świadomi https://support.microsoft.com/en-us/help/273793/how-to-include-client-side-script-functions-in-an-xsl-document

Powiązane problemy