2015-08-26 45 views
2

我無法將以下內容與我讀過的任何JavaScript文檔進行協調。有人可以擺脫一些光?JavaScript getter被定義爲數組而不是函數?

以下片段摘自file panelUI.js in the Mozilla repository

const PanelUI = { 
    /** Panel events that we listen for. **/ 
    get kEvents() ["popupshowing", "popupshown", "popuphiding", "popuphidden"], 

    // more properties... 

    _addEventListeners: function() { 
    for (let event of this.kEvents) { 
     this.panel.addEventListener(event, this); 
    } 
    // more code... 
    }, 

    // more properties... 

一切我讀過有關JS定義一個getter本質上是一個函數(或「即得到特定屬性的值的方法」和「獲取語法綁定的對象屬性的功能這將被稱爲當該屬性被擡頭「),所以我有點困惑,看到一個數組文字,我期望找到函數kEvents()的主體。

這是什麼意思,在JS中有一個函數名稱後跟一個數組文字(通常或作爲一個get定義的一部分)?

你將如何編寫功能等同於上述的代碼,但不使用這種奇怪的語法?

回答

1

我認爲這是SpiderMonkey對expression closures的非標準和不贊成支持的結果。

+0

是的,謝謝,那一定是吧。 「表達式閉包是一種用於編寫簡單函數的簡寫函數語法[...]此語法允許您省略大括號和'return'語句[...]以這種方式編寫代碼沒有額外的好處,除了讓它在語法上更短。「 - 很高興現在已棄用! –

1

這是不合法的JavaScript以任何方式...除非Firefox允許它作爲替代語法出於某種原因。

但是,如果您嘗試在Chrome瀏覽器中運行此類或類似的代碼,甚至嘗試使用Babel和ES6編譯它,則會失敗。

0

你將如何編寫功能等同於上面的代碼,但不使用這種奇怪的語法?

的「等價」的語法似乎是包裹在大括號中的數據並將其返回:

get kEvents() { 
    return ["popupshowing", "popupshown", "popuphiding", "popuphidden"]; 
}, 

我猜想,示例代碼返回每次都在同數組實例,而我的代碼每次調用時都會生成一個新的數組。

我想,列出的行是一個非標準的語法,mozilla已經實現,但是與任何當前規範都沒有關聯。通常,瀏覽器開發社區通過這些功能推動瀏覽器實現一項新功能,以確定標準化是否值得。它可能是一個建議的語法,後來也被丟掉了

所有這些都說,這是推測性的,因爲我從來沒有看到過這種語法的標準。