Джаваскриптовая ошибка «undefined is not a function» довольно загадочна. Как раз поэтому определённым спросом пользуются разъяснительные статьи, из которых читатель, начинающий изучать программирование на JavaScript, способен узнать о том, что такая ошибка (попытка использовать неопределённое значение как функцию) чаще всего возникает при вызове несуществующего метода объекта (а такой вызов, в свою очередь, чаще всего происходит в случае опечатки в названии метода). Такой разъяснительной статьёю может послужить «Ошибки в JavaScript и как их исправить», например.

Однако и после разъяснений остаётся мысль о том, что обнаружение и устранение опечаток (да и других оплошностей при вызове методов) было бы много проще, если бы название «виновного» метода содержалось непосредственно в тексте появляющейся ошибки.

Так и вышло:

Впрочем, вышеозначенное улучшение сообщения об ошибке произошло только в V8, то есть появится оно только в Google Chrome, в Chromium, в новой Опере, а со временем — в Node.js и в других нодоподобных движках, служащих для запуска внебраузерного джаваскрипта. О внедрении подобного улучшения в остальных браузерах ничего не известно.

Комментарии (22)


  1. MuLLtiQ
    19.04.2015 15:59
    +21

    Firefox 37.0.1
    image


    1. isden
      19.04.2015 17:28
      +14

      А в Сафари что-то среднее


      1. everyonesdesign
        19.04.2015 22:55
        +3

        Мне кажется, что это самый информативный и поэтому лучший формат.


  1. Pavel7
    19.04.2015 18:47
    +5

    IE версии с 9 или 10 пишет более осмысленную ошибку: image


    1. Iv38
      20.04.2015 03:38
      +3

      Жаль что не пишет какой объект, а только метод.


  1. relclick
    19.04.2015 20:44
    +8

    Интересно, это было так сложно сделать, что до этого дошли только сейчас? Профит же очевиден.


    1. Mithgol Автор
      19.04.2015 21:33
      -2

      На всякий случай уточню, что (судя по дате в Твиттере) до изменения в коде Хрома додумались без мaлого два месяца назад, но в тестовых версиях, которые только теперь начинают обретать стабильность и доходить до конечных пользователей.

      (Хотя понятно, что «почему не два года назад?» и всё такое.)


      1. DenimTornado
        20.04.2015 02:34

        Ну как же в тестовых? Вот мой скрин ниже, самая что ни на есть релизная stable версия.


        1. Mithgol Автор
          20.04.2015 07:23
          -3

          Наводящий вопрос: когда упомянутая Вами версия Chrome 42.0.2311.90 вышла в свет?


  1. sulnedinfind
    19.04.2015 20:54
    +5

    Для смягчения адаптации к новому.


  1. servekon
    19.04.2015 21:39
    +8

    Круто, конечно, но разве отладчик не показывает номер строки, где произошла ошибка? Не вижу проблемы в том, чтобы перейти на нужную строку и исправить очепятку.


    1. Keyten
      20.04.2015 01:40

      И ещё, имхо, затруднения ошибка может вызвать лишь в первый раз, когда с ней сталкиваешься. А может и не вызвать.


    1. quux
      20.04.2015 07:39
      +3

      Проблемы, конечно, нет. Может быть даже для кого-то отрезок времени, в течении которого идешь к нужной строке, является источником дофамина. Но мне психологически комфортнее сразу узнать, какой кусок текста не функция.


    1. pman
      20.04.2015 10:38
      +1

      Проблемы возникают когда есть желание отловить все ошибки. Вот например есть сборщик JS ошибок в консолях клиентов сайта, доступа к самим консолям нет, в результате в базу данных пишется только строчка ошибки и минимальная доступная информация.

      И вот на девелоперской машине все отлично, без ошибок, а от пользователей вал «undefined is not a function».

      Именно в этом случае данное улучшение будет полезно.


    1. doozza
      20.04.2015 12:16

      Интересно, как себя поведёт в таком случае динамический вызов функции. Знание строки здесь мало поможет, если я не ошибаюсь.

      var f1 = function(){console.log('f1');}
      var a = ['f1','f2'];
      window[a[0]](); // f1
      window[a[1]](); //Uncaught TypeError: undefined is not a function
      


      1. servekon
        20.04.2015 15:02
        -1

        Отладчик ругается на эту строку:

        window[a[1]]();
        

        Согласен, что если массив 'a' объявлен намного выше по коду, тогда отладка усложняется.


  1. DenimTornado
    20.04.2015 00:09
    +1

    Chrome 42.0.2311.90 (64-bit) Mac OS X 10.10.3

    take.ms/wWP3a


    1. grossws
      20.04.2015 02:30

      Аналогично в 42.0.2311.82 на Linux


  1. 404
    20.04.2015 12:21
    +2

    Не всё так радужно.

    В старом дебаггере:

    o = {};
    o.n = 3;
    o.f() // undefined is not a function
    a.n() // number is not a function
    


    В новом дебаггере:

    o = {};
    o.n = 3;
    o.f() // o.f is not a function
    a.n() // o.n is not a function
    


    Да, теперь стало чуть лучше от того, что известно, к какому методу пытались обратиться, но вот дальше всё равно нужно внимательно дебажить.


    1. isden
      20.04.2015 12:55
      +1

      > a.n() // o.n is not a function

      А у меня говорит «Uncaught ReferenceError: a is not defined». Видимо у вас опечатка, и там должно быть o.n();


      1. isden
        20.04.2015 13:00
        +1

        Посмотрел ради интереса как оно будет в Сафари — «TypeError: 3 is not a function (evaluating 'o.n()')».


      1. 404
        21.04.2015 00:45
        +1

        Да, действительно опечатался.