Невозможно реализовать шаблон модуля - PullRequest
2 голосов
/ 01 марта 2011

Я пытаюсь воспроизвести некоторый код из книги Дугласа Крокфорда «Javascript: The Good Parts».Идея состоит в том, чтобы использовать замыкания для инкапсуляции объектов и избегать глобальных переменных, свойственных Javascript.

var serial_maker = function (  ) {

// Produce an object that produces unique strings. A
// unique string is made up of two parts: a prefix
// and a sequence number. The object comes with
// methods for setting the prefix and sequence
// number, and a gensym method that produces unique
// strings.

    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function (  ) {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    };
}(  );

var seqer = serial_maker(  );
seqer.set_prefix = 'Q';
seqer.set_seq = 1000;
var unique = seqer.gensym(  );    // unique is "Q1000"

Chrome обнаруживает ошибку:

Uncaught TypeError: Свойство serial_maker объекта[объект DOMWindow] не является функцией (анонимная функция)

Что я делаю не так?

РЕДАКТИРОВАТЬ: я должен сказать, что этот код полностью скопирован и вставлен из книги ...

Ответы [ 3 ]

8 голосов
/ 01 марта 2011

Вы пытаетесь выполнить результат функции как функцию и присваиваете значения функциям. Попробуйте:

var seqer = serial_maker;
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym();

Также смотрите это jsFiddle

1 голос
/ 23 мая 2012

В настоящее время я работаю с книгой и вижу избыточную пару скобок () в опубликованном вами коде, когда сравниваю ее с книгой. У вас есть:

        }
    };
}(  );

должно быть:

        }
    };
};

Наряду с дополнительными ответами, в которые необходимо заключить буквы «Q» и «1000» ().

1 голос
/ 08 августа 2011

В этом примере кода есть две ошибки:

  1. Определение serial_maker завершается с (), который вызывает анонимную функцию. Это делает следующую строку:

    var seqer = serial_maker();
    

    ошибочно, поскольку serial_maker - это не функция, а объект, возвращаемый анонимной функцией.

  2. После исправления предыдущей ошибки две строки:

    seqer.set_prefix = 'Q';
    seqer.set_seq = 10000;
    

    должно измениться на:

    seqer.set_prefix('Q');
    seqer.set_seq(10000);
    

(Источник: http://oreilly.com/catalog/errata.csp?isbn=9780596517748&order=date)

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