2013-05-25 243 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

我也是,似乎是一個更好的解決方案。 –