Показать сообщение отдельно
  #1 (permalink)  
Старый 02.09.2015, 22:36
Новичок на форуме
Отправить личное сообщение для ejik3800 Посмотреть профиль Найти все сообщения от ejik3800
 
Регистрация: 02.09.2015
Сообщений: 3

Пример из книги: замыкания
При открытии данного скрипта в браузере запрашивает число. Но при нажатии ок выдает: 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();
Ответить с цитированием