Помилки в javascript і як їх виправити


Перед самим списком, давайте швидко поглянемо на структуру повідомлення про помилку. Розуміння структури допомагає розуміти помилки, і ви отримаєте менше проблем, якщо натрапите на помилки, не представлені в цьому списку.

Типова помилка з Chrome виглядає так:

Тепер до самих помилок.

Uncaught TypeError: undefined is not a function


Пов'язані помилки: number is not a function, object is not a function, string is not a function, Unhandled Error: 'foo' is not a function, Function Expected

Виникає при спробі виклику значення як функції, коли значення функцією не є. наприклад:


Ця помилка зазвичай виникає, якщо ви намагаєтеся викликати функцію для об'єкта, але опечатали в назві.


Неіснуючі властивості об'єкта за замовчуванням мають значення undefined. що призводить до цієї помилку.

Інші варіації, такі як "number is not a function" виникають при спробі викликати число, як ніби воно є функцією.

Як виправити помилку: переконайтеся в коректності імені функції. Для цієї помилки, номер рядка зазвичай вказує в правильне місце.

Uncaught ReferenceError: Invalid left-hand side in assignment


Пов'язані помилки: Uncaught exception: ReferenceError: Can not assign to 'functionCall ()', Uncaught exception: ReferenceError: Can not assign to 'this'

Викликано спробою привласнити значення тому, чому неможливо привласнити значення.

Найбільш частий приклад цієї помилки - це умова в if:


У цьому прикладі програміст випадково використав один знак рівності замість двох. Вираз "left-hand side in assignment" відноситься до лівої частини знака рівності, а, як можна бачити в даному прикладі, ліва частина містить щось, чого не можна привласнити значення, що і призводить до помилки.

Як виправити помилку: переконайтеся, що ви не намагаєтеся привласнити значення результату функції або ключовим словом this.

Uncaught TypeError: Converting circular structure to JSON


Пов'язані помилки: Uncaught exception: TypeError: JSON.stringify: Not an acyclic Object, TypeError: cyclic object value, Circular reference in value argument not supported

Завжди викликано циклічної посиланням в об'єкті, яка потім передається в JSON.stringify.


Так як a і b в прикладі вище мають посилання один на одного, результуючий об'єкт не може бути приведений до JSON.

Як виправити помилку: видаліть циклічні посилання, як у прикладі вище, з усіх об'єктів, які ви хочете конвертувати в JSON.

Unexpected token;


Пов'язані помилки: Expected), missing) after argument list

Токен в даній помилку може бути різним - може бути написано "Unexpected token]", "Expected

Як виправити помилку: іноді номер рядка не вказує на правильне місце розташування, що ускладнює виправлення помилки.

Помилка з [] <> () Зазвичай викликано незбіжними парою. Перевірте, чи всі ваші дужки мають закриває пару. В цьому випадку, номер рядка зазвичай вказує на щось інше, а не на проблемний символ.

Unexpected / пов'язано з регулярними виразами. Номер рядка для даного випадку зазвичай правильний.

Unexpected; зазвичай це пов'язано з символом; всередині литерала об'єкта або масиву, або списку аргументів виклику функції. Номер рядка зазвичай також буде вірним для даного випадку.

Uncaught SyntaxError: Unexpected token ILLEGAL


Пов'язані помилки: Unterminated String Literal, Invalid Line Terminator

У строковому літералі пропущена закриваюча лапка.

Як виправити помилку: переконайтеся, що всі рядки мають правильні закривають лапки.

Uncaught TypeError: Can not read property 'foo' of null, Uncaught TypeError: Can not read property 'foo' of undefined


Пов'язані помилки: TypeError: someVal is null, Unable to get property 'foo' of undefined or null reference

Спроба прочитати null або undefined так, як ніби це об'єкт. наприклад:


Як виправити помилку: зазвичай це пов'язано з помилками. Перевірте, чи всі змінні, використані поруч з рядком, що вказує на помилку, правильно названі.

Uncaught TypeError: Can not set property 'foo' of null, Uncaught TypeError: Can not set property 'foo' of undefined


Пов'язані помилки: TypeError: someVal is undefined, Unable to set property 'foo' of undefined or null reference

Спроба записати null або undefined так, як ніби це об'єкт. наприклад:


Як виправити помилку: це теж зазвичай це пов'язано з помилками. Перевірте імена змінних поруч з рядком, що вказує на помилку.

Uncaught RangeError: Maximum call stack size exceeded


Пов'язані помилки: Uncaught exception: RangeError: Maximum recursion depth exceeded, too much recursion, Stack overflow

Зазвичай викликано неправильно програмної логікою, що призводить до нескінченного викликом рекурсивної функції.

Як виправити помилку: перевірте рекурсивні функції на помилки, які можуть змусити їх робити рекурсивні виклики вічно.

Uncaught URIError: URI malformed


Пов'язані помилки: URIError: malformed URI sequence

Викликано некоректним викликом decodeURIComponent.

Як виправити помилку: переконайтеся, що виклики decodeURIComponent на рядку помилки отримують коректні вхідні дані.

XMLHttpRequest can not load some / url. No 'Access-Control-Allow-Origin' header is present on the requested resource


Пов'язані помилки: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at some / url

Ця проблема завжди пов'язана з використанням XMLHttpRequest.

Як виправити помилку: переконайтеся в коректності запитуваної URL і в тому, що він задовольняє same-origin policy. Хороший спосіб знайти проблемний код - подивитися на URL в повідомленні помилки і знайти його в своєму коді.

InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable


Пов'язані помилки: InvalidStateError, DOMException code 11

Чи означає те, що код викликав функцію, яку не можна було викликати в поточному стані. Зазвичай пов'язано c XMLHttpRequest при спробі викликати на ньому функції до його готовності.


В даному випадку ви отримаєте помилку тому, що функція setRequestHeader може бути викликана тільки після виклику xhr.open.

Як виправити помилку: подивіться на код в рядку, що вказує на помилку, і переконайтеся, що він викликається в правильний момент або додає потрібні виклики до цього (як з xhr.open).

висновок

P.S. Цей переклад можна поліпшити, відправивши PR тут.

Добре-добре, розверну думка для тих, хто не зрозумів. Коли ви використовуєте jQuery, помилка типу «Uncaught TypeError: undefined is not a function», яка відбулася в надрах вашої функції, наприклад, обробника кліка по посиланню / кнопці / ітп буде показувати куди завгодно, тільки не на вашу функцію. В принципі навіть не поруч. Можна тільки здогадатися, що останній раз ти міняв там-то і можливо. десь там щось десь не враховано або не там стоїть кома (на які яваскрипт вообщем-то теж покласти і повідомлення про помилку теж буде вести куди завгодно, крім вашої функції з помилкою)

гиги, jquery, в основному, вішають на елементи DOM'а, а тут все просто і дебажіть та інше.

моє улюблене: jquery плагін (слайдер картинок) на конкретній сторінці сайту падає всередині себе з повідомленням про «undefined is not a function». Падає тільки на цій сторінці, при цьому сам плагін роками успішно застосовується і працює на купі сайтів без будь-яких проблем. Причина? Інший скрипт підтягнув ззовні іншу версію jQuery і в результаті у нас на сторінці виявляється два jQuery різних версій. Причому самі-то функції jQuery дану ситуацію якось примудряються розрулювати ...

За вказаною помилку налагоджувати дану проблему можна дуже і дуже довго, особливо якщо ви не в курсі останніх змін в коді.

Налагодження в консолі браузера - це біль.

Ну, девтулзи хрому вам наприклад покажуть повний стек викликів, і там ви знайдете номер рядка в вашому файлі, з якої все почалося

Схожі статті