Комментарии 23
а можно каким-нибудь образом это сократить до
breakpoint function (_$) { return eval(_$); };
?
breakpoint function (_$) { return eval(_$); };
?
0
Страшно стало от мысли — поставить такой брейкпоинт в цикле… Сколько раз надо нажать «нет, пока не останавливаемся».
Я понимаю что можно поставить кучу условий на возникновение брейка, но часто эти условия становятся известны уже после отладки, а до этого: приходится следить за многими параметрами.
Я понимаю что можно поставить кучу условий на возникновение брейка, но часто эти условия становятся известны уже после отладки, а до этого: приходится следить за многими параметрами.
+1
Насчёт условий входа — спасибо за мысль, я займусь. А насчёт цикла — что поделать, в этом суть точки останова. :^) Или я неверно понял вашу мысль?
+1
Я не понял Вашу мысль, что именно Вы не поняли в моей мысли? :)
В цикле for(var i=0;i<x;i++) нет проблем, а вот в while(true){… (if(somеthing) break)^n ...} очень трудно представить, где бряку ставить + когда ей срабатывать.
Вообще сакральный замысел «изобретения» непонятен.
Особенно учитывая ниже сказанное Во всех браузерах есть отладчики: habrahabr.ru/blogs/javascript/76485/
В цикле for(var i=0;i<x;i++) нет проблем, а вот в while(true){… (if(somеthing) break)^n ...} очень трудно представить, где бряку ставить + когда ей срабатывать.
Вообще сакральный замысел «изобретения» непонятен.
Особенно учитывая ниже сказанное Во всех браузерах есть отладчики: habrahabr.ru/blogs/javascript/76485/
0
> while(true){… (if(somеthing) break)^n ...}
Если честно, то «вечные» циклы лучше не писать совсем — всегда имеет смысл добавлять сто-то типа __continue в качестве условия продолжения в целях удобства отладки: while(__continue)…
А в такой точке останова можно написать __continue = false, и всё такое… :^) Можно сделать из всего этого большой отладчик с условиями, отловом ошибок и т.д. — только зачем, если такие уже есть? Вы же не станете отрицать, что иногда испольуете alert в целях отладки? :^)
> Вообще сакральный замысел «изобретения» непонятен.
Да нет никакого особо сакрального смысла. Просто может, где-то пригодится — иногда очень нужно протестировать состояние скрипта там, где отладчик не установлен (комп Маши, см. ниже). Дебагер не является частью браузера, а доустанавливается отдельно — не будете же вы секретарше дебагер ставить. :^) А рассказывать о «фантомных» багах, я думаю, не нужно — и так известная проблема.
Если честно, то «вечные» циклы лучше не писать совсем — всегда имеет смысл добавлять сто-то типа __continue в качестве условия продолжения в целях удобства отладки: while(__continue)…
А в такой точке останова можно написать __continue = false, и всё такое… :^) Можно сделать из всего этого большой отладчик с условиями, отловом ошибок и т.д. — только зачем, если такие уже есть? Вы же не станете отрицать, что иногда испольуете alert в целях отладки? :^)
> Вообще сакральный замысел «изобретения» непонятен.
Да нет никакого особо сакрального смысла. Просто может, где-то пригодится — иногда очень нужно протестировать состояние скрипта там, где отладчик не установлен (комп Маши, см. ниже). Дебагер не является частью браузера, а доустанавливается отдельно — не будете же вы секретарше дебагер ставить. :^) А рассказывать о «фантомных» багах, я думаю, не нужно — и так известная проблема.
0
Во всех браузерах есть отладчики: habrahabr.ru/blogs/javascript/76485/
0
Во всех типах браузеров, если точнее. :^) Этот маленький отладчик можно использовать по какой небудь специальной директиве, которая включает отладку (например, двойной клик на копирайт :^), чтобы протестировать код в нужных местах с любого браузера, даже того, где отладчик не установлен (например, комп Маши из бухгалтерии).
Но вообще говоря, способ и не претендует на полноценный отладчик — так, на всякий случай. :^)
Но вообще говоря, способ и не претендует на полноценный отладчик — так, на всякий случай. :^)
0
А что такое ИА?
И да, я не знаю ни одного браузера без дебаггера.
И да, я не знаю ни одного браузера без дебаггера.
0
А разве задачу передачи контекста нельзя решить при помощи arguments?
https://developer.mozilla.org/En/Core_Javascript_1.5_Reference/Functions_and_function_scope/arguments
https://developer.mozilla.org/En/Core_Javascript_1.5_Reference/Functions_and_function_scope/arguments
0
Мне самому не нравится этот аппендикс function ..., но я не смог от него избавиться (хотя очень пытался) — возможно, удастся это сделать в будущем. Проблема в том, что передать контекст функции в eval можно, но не везде. А объект VO (var object) — это не более чем «олицетворение» из стандартов ECMAscript.
0
Не могли бы вы подробнее остановиться на «передать контекст функции в eval можно, но не везде»?
Что имеется ввиду?
Что имеется ввиду?
+1
Вот в этой статье вы можете найти пример, когда eval'у передаётся два аргумента — выражение и контекст. Сейчас механизм работает через with, но применим только к объектам, т.е. к внутренним переменным функции вы так доступ не получите.
+1
Спасибо, я не знал про второй аргумент eval!
А как это можно было бы использовать для вашего отладчика?
А как это можно было бы использовать для вашего отладчика?
+1
Технически, можно было бы передавать ссылку на функцию, чтобы использовать её в eval функции breakpoint. Но это, к сожалению, будет работать только в ранних версиях sidermonkey. Я ищу способ избавиться от аппендикса function ..., но пока безуспешно. Если найдёте способ — поделитесь, если не жалко. :^)
0
Ну что ж, мне кажется способ есть. Что если сделать так:
После этого в отлаживаемой функции можно просто вызвать:
или даже просто:
function breakpoint (name) { return eval('breakpoint.exec("'+ name +'", function (_$) { return eval(_$) })'); } breakpoint.exec = function (_name, _context) { ... // цикл вашего отладчика }
После этого в отлаживаемой функции можно просто вызвать:
breakpoint('name');
или даже просто:
breakpoint();
+1
Боюсь, это не совсем то, что нужно. Eval действует в том контексте, в котором его вызвали, так же как любая другая инструкция — т.е. в данном случае return eval('expr') эквивалентно просто return expr, то есть контекст будет задан для функции break, что, в общем-то, ни к чему.
Впрочем, я могу ошибаться, ибо сделать полноценную проверку мне мешает то, что я уже засыпаю. :^) Но я обязательно протестирую пример завтра в начале рабочего дня.
Возможно, вам поможет использование переменной arguments.callee.caller, которая ссылается на функцию, которая вызвала функцию arguments.callee — ведь для функции breakpoint именно к контексту .caller нужно получить доступ.
Впрочем, я могу ошибаться, ибо сделать полноценную проверку мне мешает то, что я уже засыпаю. :^) Но я обязательно протестирую пример завтра в начале рабочего дня.
Возможно, вам поможет использование переменной arguments.callee.caller, которая ссылается на функцию, которая вызвала функцию arguments.callee — ведь для функции breakpoint именно к контексту .caller нужно получить доступ.
0
Мм… а вот FF вроде согласен с моей идеей )
Мне кажется, return eval('expr') действительно эквивалентно просто return expr, НО вызванному в контексте отлаживаемой функции. Нет?
Мне кажется, return eval('expr') действительно эквивалентно просто return expr, НО вызванному в контексте отлаживаемой функции. Нет?
0
FF, как и любой другой браузер, запустит такую точку останова. Но контекст вызвавшей функции будет, увы, недоступен.
Eval выполняется точно так же, как и любой другой оператор — в том контексте, в котором он вызван. Насколько мне известно, никаких исключений на этот счёт не предусмотрено.
Но ваш пример с eval('breakpoint.exec...') сработает, если вызвать его не внутри функции breakpoint, а непосредственно в отлаживаемой функции. Это даёт нам возможность просто определить константу и писать eval(breakpoint) — не так красиво, как просто breakpoint, но тоже неплохо. :^) Смотрите последний UPD в топике. Благодарю вас за отличную идею!
Eval выполняется точно так же, как и любой другой оператор — в том контексте, в котором он вызван. Насколько мне известно, никаких исключений на этот счёт не предусмотрено.
Но ваш пример с eval('breakpoint.exec...') сработает, если вызвать его не внутри функции breakpoint, а непосредственно в отлаживаемой функции. Это даёт нам возможность просто определить константу и писать eval(breakpoint) — не так красиво, как просто breakpoint, но тоже неплохо. :^) Смотрите последний UPD в топике. Благодарю вас за отличную идею!
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Небольшой отладчик в Javascript