2014-10-01 86 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