Отладка JavaScript - PullRequest
       6

Отладка JavaScript

3 голосов
/ 19 сентября 2010

Я недавно начал возиться с проблемами Project Euler и пытаюсь решить их в Javascript.Делая это, я имею тенденцию создавать много бесконечных циклов, и теперь мне интересно, есть ли лучший способ завершить сценарий, чем уничтожение вкладки в Firefox или Chrome?

Кроме того, firebug по-прежнему считается «лучшим» отладчиком (я сам не вижу большой разницы между firebug и инструментом веб-разработки в safari / chrome).

Любой, как хорошо провести воскресенье!

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

Firebug по-прежнему мой личный инструмент выбора.

Что касается способа убить ваши бесконечные петли.Некоторые браузеры будут препятствовать этому вообще.Тем не менее, я все еще предпочитаю просто набрать ctrl + w , но это все равно закрывает вкладку.

Некоторые другие альтернативы, которые вы можете посмотреть:1010 *

Opera: Dragonfly

Safari / Chrome: Web Inspector

Несмотря на то, что у Opera есть хороший набор инструментов для разработчиков, который я нашел довольно полезным.(Инструменты-> Дополнительно-> Инструменты разработчика)

0 голосов
/ 19 сентября 2010

Несмотря на то, что иметь Firebug или отладчики webkit - это хорошо, в противном случае браузер выглядит слишком затратно для Project Euler.Почему бы не использовать среду выполнения, такую ​​как Rhino или V8 ?

0 голосов
/ 19 сентября 2010

Если вы не хотите вставлять код для явного выхода, попробуйте использовать условную точку останова. Если вы откроете консоль сценария Firebug и щелкнете правой кнопкой мыши в канавке рядом с кодом, она вставит точку останова и предложит вам вариант ее запуска, удовлетворяющий некоторому условию. Например, если ваш код был таким:

var intMaxIterations = 10000;
var go = function() {
    while(intMaxInterations > 0) {
        /*DO SOMETHING*/
        intMaxIterations--;
    }
};

... вы можете либо дождаться завершения всех 10 000 итераций цикла, либо вы можете поместить условную точку останова где-нибудь внутри цикла и указать условие intMaxIterations < 9000. Это позволит коду внутри цикла запускаться 1000 раз (ну, фактически, 1001 раз). В этот момент, если вы хотите, вы можете обновить страницу.

Но как только сценарий входит в бесконечный цикл (либо по ошибке, либо по замыслу), вы не можете сделать, как я знаю, многое, чтобы остановить его, если вы не подготовились к этому. Именно поэтому, когда я делаю что-то сильно рекурсивное, я устанавливаю ограничение на количество попыток выполнения определенного блока кода. Есть много способов сделать это. Если вы считаете поведение действительной ошибкой, подумайте об этом. Э.Г.

var intMaxIterations = 10000;
var go = function() {
    while(true) {
        /*DO SOMETHING*/
        intMaxIterations--;

        if (intMaxIterations < 0) {
            throw "Too many iterations. Halting";
        }
    }
};

Edit: Мне просто пришло в голову, что, поскольку вы являетесь единственным человеком, использующим этот сценарий, веб-работники являются идеальным решением.

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

В первый раз, когда вы настраиваете веб-работника, это немного вредно, но в этом случае вам придется сделать это только один раз. Если ваш алгоритм никогда не возвращается, просто нажмите кнопку и убейте рабочий поток. См. Использование веб-работников на MDC для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...