1

在阅读“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);
4

3 回答 3

4

如果您只打算生成字符串Q1000,那么没有区别,但这不是重点。书中的示例使用了闭包,因此prefixandseq部分是私有的,并且只能从函数内部访问。

所以想法是,你可以这样做:

 var unique = seqer.gensym( ); // unique is "Q1000"

然后你可以这样做

 var anotherUnique = seqer.gensym( ); // unique is "Q1001"

因为serial_maker跟踪它自己的状态,而您的代码没有。如果我们使用书中的代码,那么在设置好之后,serial_maker我们可以.gensym根据需要多次调用并获得不同的结果。使用您的代码,您需要以某种方式跟踪您已经使用过哪些代码。

于 2013-05-25T20:52:53.197 回答
3

主要区别在于外部function范围包含 and 的声明prefixseq因此它们包含在将跟随seqer对象的闭包中。

换句话说,书中的示例返回一个具有状态的对象,而您的示例是一个普通函数(不使用任何状态)。

于 2013-05-25T20:49:29.623 回答
0

serial_maker 的重点是它在 seq 中为每个串行制造商存储状态,以确保任何人都不会产生重复。如果前缀不同,则系列制造商之间也不会有重复。

于 2013-05-25T20:50:19.127 回答