2014-10-01 123 views
0

在Douglas Crockford的「JavaScript:The Good Parts」中,有一個使用函數和閉包來封裝模塊的例子。根據以下說明獨特應包含「Q1000」。我希望此模塊模式能夠正常工作,但前綴seq似乎不會被更改,因爲唯一在運行此示例時會產生「0」。可能是什麼原因?閉合模塊封裝

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" 
+2

你覆蓋'SET_ *'功能,不稱他們。 – 2014-10-01 11:40:13

回答

1

您正在覆蓋set_*函數,而不是調用它們。這裏有兩種不同的方式來解決它


更改爲調用

var seqer = serial_maker(); 
seqer.set_prefix('Q'); 
seqer.set_seq(1000); 
var unique = seqer.gensym(); // unique is "Q1000" 

使用set操作

return { 
    set prefix(p) { 
     prefix = p.toString(); 
    }, 
    set seq(s) { 
     seq = s | 0; 
    }, 
    gensym: function() { 
     var result = prefix + seq; 
     seq += 1; 
     return result; 
    } 
}; 

// ... 

var seqer = serial_maker(); 
seqer.prefix = 'Q'; 
seqer.seq = 1000; 
var unique = seqer.gensym(); // unique is "Q1000" 
+0

你說得對。看起來像書中的錯誤。很不幸,因爲我正在努力學習這門語言。 – zunder 2014-10-01 11:45:33

+0

快速搜索'Q1000'會顯示其他引用此示例的問題,而不會出現此錯誤(例如http://stackoverflow.com/questions/16753750/difference-between-these-two-functions),因此您可能會對這本書,或者應該仔細檢查確切的語法。 – 2014-10-01 11:49:22

+0

我自己看看:http://stackoverflow.com/questions/5156761/unable-to-implement-module-pattern看起來像第一版中的錯誤。 – zunder 2014-10-01 11:53:04