2010-11-16 6 views
5

Dostaję dziwaczny błąd w Chrome ... zobacz zrzut ekranu poniżej.Nie można ustawić właściwości ... z undefined --- bizarre

Definiuję rekord przy użyciu składni literalnej obiektu.

Próbuję ustawić właściwość "id" i uzyskać wyjątek.

Próbowałem zarówno:

record['id'] = 'wtf'; 

a także

record.id = 'wtf'; 

używam tego typu składni w każdym miejscu w moim skrypcie .... co może być tutaj dzieje? Czy to błąd w Chrome?

alt text

EDIT: mam rozwiązać ten problem teraz, ale nadal nie wiem, dlaczego tak się dzieje. Przesunąłem definicję rekordu tak, aby wystąpił poza blokiem if. Czy ktoś wie, co może się wydarzyć? Sądziłem, że wszystkie deklaracje zmiennych są objęte zakresem funkcji i dlatego nie powinno to stanowić problemu.

+0

Nie mogę odtworzyć błędu (w przeglądarce Chrome 7 i Firefox na komputerze Mac). Z informacji tutaj i ze zrzutu ekranu wynika, że ​​kod nie zawiera niczego złego. Jaka jest wartość 'record' tuż przed" błędną "linią? – nickf

Odpowiedz

15

Problem jest najprawdopodobniej taki, że dl jest mniejszy lub równy zeru, więc instrukcja, która inicjuje record, nie zostanie wykonana. Z twojego wcięcia wygląda na to, że oba oświadczenia mają być częścią bloku if, ale bez nawiasów klamrowych, instrukcja record['id'] = 'wtf'; jest wykonywana bez względu na wszystko.

Przesuwając inicjalizację zmiennych poza instrukcją if, wymusiłeś to w każdym przypadku i przeniosłeś zadanie wewnątrz bloku if (co, jak przypuszczam, jest tym, co chciałeś).

Prawdopodobnie lepszym sposobem rozwiązania jest dodanie szelki tak:

if (dl > 0) { 
    var record = {}; 

    record.id = 'wtf'; 
} 

chyba że naprawdę chce zainicjować record w obu przypadkach.

Masz rację o zmiennej deklaracji jest zawężona do funkcji, ale przypisanie nie dzieje, aż dojdziesz do tego punktu w kodzie. record był w zasięgu, ale nadal miał domyślną wartość: undefined, ponieważ jeszcze nic nie przypisałeś.

+0

Wow. Niektóre błędy są z własnej woli. Dobry chwyt ! – rvandervort

0

Działa dla mnie, nie ma powodu, dla którego nie powinien działać. Jesteś pewien, że chodzi o dokładną linię? co, jeśli przed rozpoczęciem ustawisz alert(record)? Czy próbowałeś już to debugować?

+0

Właściwie, wydaje mi się, że właśnie rozwiązałem ten problem ... ale wciąż nie jestem pewien, dlaczego tak się dzieje. Przesunąłem definicję rekordu poza blok-if i wydaje się, że działa ... Będę aktualizował główne pytanie. – rvandervort

+0

@rvandervort: jeśli odkryjesz przyczynę, koniecznie podziel się tym powodem! – nickf