2013-05-06 11 views

Odpowiedz

14

W rzeczywistości w trybie ścisłym numer nie występuje jako you can see here.

Jeśli czytasz rozdział 10.6 ECMA Standard, w szczególności uwadze 1, zobaczysz:

Dla nie-ścisłych funkcji trybu indeks tablicy (zdefiniowane w 15.4) o nazwie właściwości danych o argumenty sprzeciwu których wartości numeryczne są mniejsze niż liczba formalnych parametrów obiektu funkcji początkowo udostępniać ich wartości z odpowiednimi powiązaniami argumentów w kontekście wykonania funkcji. Oznacza to, że zmiana właściwości powoduje zmianę odpowiedniej wartości powiązania argumentu i odwrotnie. Ta korespondencja jest zepsuta, jeśli taka właściwość zostanie usunięta, a następnie przedefiniowana lub właściwość zostanie zmieniona na właściwość akcesor. W przypadku funkcji trybu ścisłego wartości właściwości właściwości arguments są po prostu kopią argumentów przekazywanych do funkcji i nie ma dynamicznego powiązania między wartościami właściwości a formalnymi wartościami parametrów.

W skrócie, chodzi o to, że w trybie nie ścisłym nazwane parametry funkcji działają jako aliasy dla obiektów w obiekcie arguments. Zatem zmiana wartości nazwanego parametru spowoduje zmianę wartości równoważnego elementu o numer arguments i na odwrót. To nie jest błąd. To jest oczekiwane zachowanie.

Jako redakcja, prawdopodobnie nie jest dobrym pomysłem, aby polegać na tym zachowaniu, ponieważ może to prowadzić do bardzo mylącego kodu. Również taki kod, jeśli jest wykonywany w trybie ścisłym, nie będzie działał dłużej.

+1

Ciekawy co do przyczyny upadku - chciałbym poprawić odpowiedź tam, gdzie to możliwe. – Dancrumb

8

Zmiana x znajduje odzwierciedlenie w arguments[0] ponieważ indeksy arguments może być getter/ustawiaczy dla pasującej nazwie argument. To jest zdefiniowana pod step 11.c.ii of 10.6:

  1. Dodaj nazwę jako element listy mappedNames.

  2. Niech g być wynikiem wywołaniem abstrakcyjne operację z argumentami nazwa i envMakeArgGetter.

  3. Niech p być wynikiem wywołaniem abstrakcyjne operację z argumentami nazwa i envMakeArgSetter.

  4. Wywołanie [[DefineOwnProperty]] wewnętrzna metoda mapy przechodzącej ToString (indx), przy czym Property Descriptor {[[Set]] P [[get]] g [[Konfigurowalny]] : true} i false jako argumenty.

Jak podano w stopniach powyżej, że wymaga to ścisłe jest fałszywe i, w tym przypadku, że f nazywany jest z wartością dla x:

f() // undefined, undefined (no argument, no getter/setter) 
f(1) // 1, 42 
Powiązane problemy