在阅读“Javascript the Good Parts”时,在“模块”一章中遇到了这段代码。
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;
console.log(result);
seq += 1;
return result;
}
};
};
var seqer = serial_maker( );
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym( ); // unique is "Q1000
我的问题是:上面和这一点之间的区别是什么:
var other_serial_maker = function(pre, num){
return pre + num;
};
var makeSerial = other_serial_maker("Q", 1000);
答案 0 :(得分:4)
如果您只想生成字符串Q1000
,那么没有区别,但这不是重点。本书中的示例使用闭包,以便prefix
和seq
部分是私有的,只能从函数中访问。
所以这个想法是,你可以这样做:
var unique = seqer.gensym( ); // unique is "Q1000"
然后你可以这样做
var anotherUnique = seqer.gensym( ); // unique is "Q1001"
因为serial_maker
会跟踪它自己的状态,而您的代码却没有。如果我们使用本书中的代码,那么在设置serial_maker
之后,我们可以根据需要多次调用.gensym
并获得不同的结果。使用您的代码,您需要以某种方式跟踪您已经使用过的代码。
答案 1 :(得分:3)
主要区别在于外function
范围包含prefix
和seq
的声明,因此它们包含在一个闭包中,该闭包将跟随seqer
对象
换句话说,本书中的示例返回一个具有状态的对象,而您的示例是一个普通函数(不使用任何状态)。
答案 2 :(得分:0)
serial_maker的意思是它为每个串行制造商在seq中存储状态,以确保任何一个不会产生重复。如果前缀不同,则串行制造商也不会有重复。