Пример из книги: замыкания
При открытии данного скрипта в браузере запрашивает число. Но при нажатии ок выдает: 4 => 4. Что автор хотел показать этим примером и как заставить его правильно работать ? Помогите в общем:)
// * В качестве имени аргумента функция использует малораспрастроненный // идентификатор $, чем снижается вероятность конфликта имен в инспектируемой // области видимости. * // * Создать точку останова можно, передав это замыкание в функцию, как // показано в примере 8.7. * // // эта функция является точки останова. Она предлагает пользователю ввести // // выражение, вычисляет его с использованием замыкания и выводит результат. // // Используемое замыкание предоставляет доступ к проверяемой области видимости. // // Таким образом любая функа будет создавать свое собственное замыкание. // // Реализовано по образу и подобию функции breakpoint() Стива Йена // // http://trimpath.com/project/wiki/TrimBreakpoint function inspect(inspector, title) { var expression, result; // существует возмодность отключать точки останова за счет создания // свойства 'ignore' у этой функции if('ignore' in arguments.callee) return; while(true) { // определить как вывести запрос перед пользователем var message = ""; // если задан аргумент title, вывести его первым if(title) message = title + '\n'; // если выражение уже вычислено, привести его вместе с его значением if(expression) message += '\n' + expression + "==> " + result + '\n'; else expression = ''; // типовое приглашение к вводу всегда должно выводиться: message += 'Введите выражение, которое следует вычислить:'; // получить ввод пользователя, перевести приглашение и использовать // последнее выражение как значение по умолчанию expression = prompt(message, expression); // если пользователь ничего не ввел(или щелкнул на кнопочке отменить), // работу в точке останова можно считать оконченной и вернуть // управление if(!expression) return; // В противном случае вычислить выражение с использованием замыкания в // инспектируемом контексте исполнения. Результаты будут введены на // следующей итерации result = inspector(expression); } } // * Обратите внимание: для вывода информации и ввода строки пользователя // функция inspect() из примера 8.7. задействует метод Window.prompt(). * // * Рассмотрим пример функции, вычисляющей факториал числа и использующей // механизм точек останова * function factorial(n) { // создать замыкание для этой функции var inspector = function($) { return eval($); } inspect(inspector, 'вход в функцию factorial()'); var result = 1; while(n > 1) { result = result * n; n--; inspect(inspector, 'factorial() loop'); } inspect(inspector, 'выход из функции factorial() loop'); return result; } factorial(); |
Все очень просто, функции inspect в теле функции factorial это точки останова в дилоговоые окна которых можно вводить значения переменных, например n или result, до тех пор пока не будет нажата кнопка отмены и точка останова завершит свою работу и передаст управление следующей инструкции.
Благодаря этим точкам можно узнать какие значения переменных на данном промежутке выполнения программы установлены. |
Часовой пояс GMT +3, время: 06:47. |