2012-06-02 77 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