2012-06-02 79 views
1

我很难理解为什么这个东西不起作用。哪里有问题?这是将值传递给此函数的正确方法,还有其他方法吗?很难为什么这个功能在javascript中不起作用

seqer.set_prefix ='Q';
seqer.set_seq = 1000;

是否possibleto做到这样:

sequer.set_prefix('Q'); 

var serial_maker = function() { 
     var prefix = ''; 
     var seq = 0; 
     return { 
      set_prefix: function (p) { 
       prefix = 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'; // is this the right way to pass in values to this function, are there other ways? is it possible to write like this sequer.set_prefix('Q); 
seqer.set_seq = 1000; // same here? 
seqer.gensym() 

;

回答

1

匿名函数是JavaScript中的一等公民 - 可以大体对待他们就像你对待一个正常功能(除了他们有没有指定的标识符,除非将它们分配到一个名字)。 Here's a good tutorial about them - 它们非常强大,我认为它们是关于JavaScript的最好的东西之一。

所以,是的,这样做的:

seqer.set_prefix = 'Q'; 
seqer.set_seq = 1000; 

不正确。用这些常量覆盖函数。你的猜测是正确的 - 打电话给他们,你可以使用:

seqer.set_prefix('Q'); 
seqer.set_seq(1000); 

顺便说一句,有你的函数另一个错误:

var serial_maker = function() { 
     ... 
     return { 
      ... 
     }; 
    }(); // <- right here 

你定义一个匿名函数,但通话它立即。所以不幸的是,var serial_maker不会是一个serial_maker - 它会是返回的对象。当然,随后的var seqer = serial_maker();将会失败,因为该对象不是一个函数。

+0

感谢您的解释,但现在正在测试。我注意到你不能改变前缀的值并在函数外部设置? THis:var seqer = serial_maker(); seqer.set_prefix ='Q'; seqer.set_seq = 1000; seqer.gensym();实际上永远不会工作因为这些变量是私有的吗?.... - YoniGeek – YoniGeek

+0

@YoniGeek:不,你可以设置它们。 JavaScript实际上没有任何'私人'成员的概念。如果你可以访问它们,那么你可以替换它们 - 这是非常动态的。所以是的,执行'seqer.set_prefix ='Q';''**将真正**替换整个函数'set_prefix'和值'Q'。 – voithos

0

set_prefixset_seq是方法。要使用它们,这样来做:

var seqer = serial_maker(); 
seqer.set_prefix('Q'); 
seqer.set_seq(1000); 
seqer.gensym(); 

此外,为了营造一个serial_maker()“模块”,你需要有这两种创建它。

var serial_maker = (function() { 
    //code here 
}()); 

//or 

var serial_maker = (function() { 
    //code here 
})(); 
+0

@josef谢谢你通过年回答。第一部分是正确的,但第二部分是艰难的。如果你这样写:var serial_maker =(function(){ // code here })();那么你不能写:serial_marker();但是serial_marker;现在如果你想写serial_marker();那么你必须像这样改变整个范围:function(){ // code here }; – YoniGeek