0

我是 JavaScript 新手,在阅读了“JavaScript The Good Parts”之后,我想编写一些有趣的代码。我偶然发现了这段我无法理解的代码:

const actions = {
  say(sessionId, context, message, cb) {
    console.log(message);
    cb();
  },
  merge(sessionId, context, entities, message, cb) {
    // Retrieve the location entity and store it into a context field
    const loc = firstEntityValue(entities, 'location');
    if (loc) {
      context.loc = loc;
    }
    cb(context);
  },
  error(sessionId, context, error) {
    console.log(error.message);
  },
  ['fetch-weather'](sessionId, context, cb) {
    // Here should go the api call, e.g.:
    // context.forecast = apiCall(context.loc)
    context.forecast = 'sunny';
    cb(context);
  },
};

它是从 wit.ai node.js 客户端截取的。在我的理解中,“actions”是一个对象,“say”、“merge”、“error”和“['fetch-weather']”是保存为没有键的值的函数。

没有保留字“function”怎么可能定义一个函数?

我也无法理解“['fetch-weather']”部分。

4

3 回答 3

0

没有保留字“function”怎么可能定义一个函数?

你可以在这里找到答案

我也无法理解“['fetch-weather']”部分。

ES6 引入了这种语法,并带有一个名为Computed Property Names的功能,您可以在其中动态定义属性名称。

使用 ES5,您不能fetch-weather直接在对象字面量中声明无效标识符,例如作为属性。

ES6:

const actions = {
    ...,
    ['fetch-weather'](sessionId, context, cb) {
    },
    ...
};

ES5:

var actions = {
    // props here
};

actions['fetch-weather'] = function(sessionId, context, cb) {
    ...
};
于 2016-04-22T10:20:54.170 回答
0

我也无法理解“['fetch-weather']”部分。

我想这是因为他们-在函数名中使用了 a 。

所以actions.fetch-weather(..);非法的,因为它-是一个运营商。

另一方面,使用- 表示actions['name']法,您可以使用任何名称。

于 2016-04-22T10:10:44.273 回答
0

这是ES6中的一个新特性,即简写方法名称。它与

const a = {
    say: function say(sessionId, context, message, cb) {
        console.log(message);
        cb();
    }
}
于 2016-04-22T10:07:18.497 回答