2010-10-28 73 views
2

我創建的對象具有Crockford常用的私有/公共訪問限制。例如,我有這樣的事情:爲什麼Closure Compiler不會爲從匿名函數返回的對象強制執行函數簽名?

var foo = (function() { 
    var myPrivateVariable = "whatever"; 
    return { 
     myPublicFunction:function(str){ 
        return str; 
       } 
    } 
}()); 

如果我發出了一個電話,如

myPublicFunction(); 

閉幕應該告訴我,我調用函數與錯誤的參數數目。我試過用JavaDoc關於myPublicFunction的評論來幫助關閉:

var foo = (function() { 
    var myPrivateVariable = "whatever"; 
    return { 
     /** 
     * @param {string} str 
     */ 
     myPublicFunction:function(str){ 
        return str; 
       } 
    } 
}()); 

foo.myPublicFunction(); 

仍然沒有投訴。我試過foo的各種形式的JavaDoc的,並且只有在工作之一是它的文檔作爲記錄類型:

/** 
* @type {{myPublicFunction:function(string):string}} 
*/ 
var foo = (function() { 
    var myPrivateVariable = "whatever"; 
    return { 
     /** 
     * @param {string} str 
     */ 
     myPublicFunction:function(str){ 
        return str; 
       } 
    } 
}()); 

foo.myPublicFunction(); 

這工作,但編譯器並沒有試圖強制執行的myPublic目標函數實際上與我在JavaDoc的記錄字段中記錄的簽名匹配。因此,只要我確保將這些返回的對象中的所有函數都記錄下來,並確保將我的文檔中的簽名與我實際返回的內容保持一致,就可以工作。我是否錯過了一些更好的方法來執行此操作?

謝謝!

+0

with --warning_level = VERBOSE,我得到這個代碼的警告(使用最新的閉包編譯器):「Function foo.myPublicFunction:用0參數調用。函數需要至少1個參數,不超過1個參數。「 – 2012-05-11 14:25:59

回答

1

我實際上鼓勵你看看使用僞古典繼承,因爲編譯器可以消除皺紋。邁克爾柏林有詳細的文章描述這個問題。

http://bolinfest.com/javascript/inheritance.php

+0

啊,非常有趣。感謝您的幫助(再次 - 您昨天幫我解決了關閉問題)。我的團隊和我正在討論是否更好地生成我們認爲的真實,更便攜(如果我們決定不繼續使用Closure編譯器)運行時信息隱藏,而不是Closure編譯時​​執行;或者如果我們應該按照Closure喜歡的方式行事,因爲我們會在下一步獲得更好的結果。現在,我們只是將我們的腳趾頭放到Closure池中,只是爲了捕獲錯誤而不是用於壓縮,而不是用於壓縮...... – 2010-10-28 21:11:14

+0

哦,還有,您是否對Closure未能執行有任何想法/評論函數簽名聲明。我在後面提到它,但是如果我編寫/ ** @type {function(string)} */var foo = function(){},編譯器不會注意到這種差異。 – 2010-10-28 21:11:43

0

您沒有提供任何類型的信息,以 「富」。您已將類型信息提供給對象的屬性(myPublicFunction)。

你的「記錄類型」JsDoc實際上把類型信息放在「foo」上,所以它的工作原理。

這是編譯器的預期行爲。

相關問題