2012-05-30 49 views
0

雖然通過KnockoutJS的例子,我看到下面的codeJavascript方法使用

function WebmailViewModel() { 
    // Data 
    var self = this; 
    self.folders = ['Inbox', 'Archive', 'Sent', 'Spam']; 
    self.chosenFolderId = ko.observable(); 

    // Behaviours  
    self.goToFolder = function(folder) { self.chosenFolderId(folder); };  
}; 

ko.applyBindings(new WebmailViewModel()); 

我不是在Javascript的專家,但通過使用self.chosenFolderId(folder);

chosenFolderId是一個屬性有點迷茫,並分配ko.observable();與其他語言的經驗,

  1. 怎麼能通過傳遞參數來調用它,如self.chosenFolderId(folder);
  2. 文件夾定義在哪裏?

如果你可以指向一篇文章,解釋這將做。

謝謝。

回答

1

chosenFolderId是一個屬性,但屬性可以是函數(而且必須是在這種情況下) 。

所以ko.observable返回一個函數,該函數接受一個參數(文件夾)。

那比下一行不同:

self.goToFolder = function(folder) { ... }; 

其中goToFolder屬性被設置爲一個功能。

folder本身被「定義」爲參數goToFolder的參數。不管什麼調用goToFolder提供了一個值爲folder

+0

感謝戴夫。所以參數(文件夾)不一定是特定的類型。我知道JS本質上是動態的。那麼,類型信息不需要? – bsr

+0

@bsreekanth幾乎可以肯定它需要是某種類型的,或者包含一個對框架有意義的值 - *這個類型或值是什麼,我不知道。你可以通過在'goToFolder'函數中放置一個斷點或者只記錄它來確定它是什麼。 –

+0

對於參考。它在這裏簡潔地解釋.. http://javascript.about.com/library/blargs.htm最明顯的區別是Javascript不使用強數據類型,因此參數沒有爲它們指定類型,而是採取無論什麼數據類型傳遞給他們。另外,Javascript被解釋並且不被編譯,因此在運行時將檢測到任何不匹配,而不是編譯時間,因爲沒有編譯步驟。 – bsr

0

javascript中的函數是第一類對象。 ko.observable()是一個函數調用,它的返回值本身就是一個函數。

基本上我可以做這樣的事情:

var observable = function(some_param) { 
    return function(some_other_param) { 
    // do something useful here 
    } 
} 

然後我可以叫:

observable(1)(2); 
0

在JavaScript函數中可以賦予變量,作爲參數傳遞給函數,從函數返回等等。換句話說,就是'First-class