2013-05-25 155 views
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

如果你只是客观的生成字符串Q1000那么没有什么区别,但那不是重点。本书中的示例使用闭包,因此prefixseq部分是私有的,只能从该函数内访问。

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

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

然后你就可以做到这一点

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

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

+0

感谢您的明确解释。仍然试图把我的头包起来...... – cusejuice

3

的主要区别是,外function范围包含prefixseq声明,所以它们被包含在将关闭seqer对象的封闭中。

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

0

serial_maker的意义在于,它为每个序列制造商在seq中存储状态,确保任何一个不会产生重复。如果前缀不同,那么串行制造商也不会有重复。

+0

只要你只调用一次'.set_seq'! –

+1

正确 - 如果是我,我会创建初始值参数,之后不允许更新。 – DrC

+0

我也是,似乎是一个更好的解决方案。 –