Читаю в свободное время книжку «JavaScript: The Good Parts» от гуру-дяди Douglas-а Crockford-а, причем в эээ... подлинике, хотя назвать таковым chm сборку книжки, довольно трудно, хотя и на языке оригинала. Наткнулся там на фрагмент кода:
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"
Вообщем нижняя часть - это полнейшее фуфло неработающее. На выходе замыкания объект, его же пытаются выполнить, потом вообще чухня с переназначением...
Естественно пришла мысль о том, что моя chm сборка книжки малость дефектная и я ломанулся в инет искать правильную версию.
Нашел другой
вариант:
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"
Изменения, как говорится, на лицо. Потерялось замыкание, вернее его организуют в var seqer = serial_maker(); И хоть, слава небу, это не вызывает ошибки ;), но дальше идет полнейший ппц. Глюки сканера, корявые руки редактора? Теряюсь в догадках... может еще версии поискать?
Верный вариант по-моему таков:
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;
// или без начального замыкания var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym(); // unique is "Q1000"