Как стать автором
Обновить

Небольшой отладчик в Javascript

Время на прочтение3 мин
Количество просмотров615
Недавно столкнулся в исследованиях с проектом trimpath. Лично для себя ничего интересного не обнаружил, кроме интересного способа расстановки точек останова (я его немного видоизменил от оригинала — иначе длинные строки некорректно отображались в опере и ИА)

  1. breakpoint = function (_name, _context)
  2. {
  3.     if(!breakpoint.allow)
  4.     {
  5.         return;
  6.     }
  7.     var expr, result, output;
  8.     while(true)
  9.     {
  10.         expr = prompt('Debug into breakpoint "' + _name + '"' , '');
  11.         if(!expr)
  12.         {
  13.             break;
  14.         }
  15.         else
  16.         {
  17.             output = true;
  18.             try
  19.             {
  20.                 result = result = _context(expr);
  21.             }
  22.             catch(e)
  23.             {
  24.                 alert('[!] caught exception with message "' + e.message + '"');
  25.                 output = false;
  26.             }
  27.             if(output)
  28.             {
  29.                 alert(result);
  30.             }
  31.         }
  32.     }
  33. }
  34.  
  35. breakpoint.allow = true;
* This source code was highlighted with Source Code Highlighter.


Теперь чтобы поставить току останова нужно написать что-то вроде этого:

  1. function f(_a, _b, _c)
  2. {
  3.     var a = 10;
  4.     var b = 20;
  5.     var c = 30;
  6.     breakpoint("breakpoint1", function (_$) { return eval(_$); });
  7. }
  8.  
  9. f(40, 50, 60);
* This source code was highlighted with Source Code Highlighter.


Обратите внимание на функцию function (_$) { return eval(_$); } — так точке останова передаётся контекст вызывающей функции. Имя _$ использовано как редко встречаемый идентификатор.

Пригодиться этот механизм может там, где нет фаербага или других нормальных отладчиков, например в ИА. Просто и со вкусом. :^)

Прошу прощения, если написал боян — для меня это было новым подходом.

UPD#1 08.12.09

Если изменить код точек останова вот так:

  1. debug = true;
  2.  
  3. breakpoint = '(new Breakpoint(\'anonymous\')).exec(function (_$) { return eval(_$); });';
  4.  
  5. Breakpoint = function (_name)
  6. {
  7.     this.name = _name ? 'anonymous' : _name;
  8.     this.allow = true;
  9. }
  10.  
  11. Breakpoint.prototype.exec = function (_context)
  12. {
  13.     if(!(debug && this.allow))
  14.     {
  15.         return;
  16.     }
  17.     ...
  18. }
* This source code was highlighted with Source Code Highlighter.


то можно будет писать вот так:

  1. eval(breakpoint);
* This source code was highlighted with Source Code Highlighter.


Спасибо asmolianinov за идею (см. комментарии).
Теги:
Хабы:
Всего голосов 20: ↑16 и ↓4+12
Комментарии23

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн