2015-08-26 24 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已经实现,但是与任何当前规范都没有关联。通常,浏览器开发社区通过这些功能推动浏览器实现一项新功能,以确定标准化是否值得。它可能是一个建议的语法,后来也被丢掉了

所有这些都说,这是推测性的,因为我从来没有看到过这种语法的标准。