此 JavaScript 对象中定义的值是否实际起作用

Are the values defined in this JavaScript object actually functions?

本文关键字:是否 起作用 JavaScript 对象 定义      更新时间:2023-09-26

我是 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 节点.js客户端截取的。在我的理解中,"动作"是一个对象,"说"、"合并"、"错误"和"['fetch-weather']"是保存为没有键的值的函数。

如何在没有保留字"函数"的情况下定义函数?

我也无法理解"['获取天气']"部分。

这是 ES6 中的一个新功能,简写方法名称。它与

const a = {
    say: function say(sessionId, context, message, cb) {
        console.log(message);
        cb();
    }
}

我也无法理解"['获取天气']"部分。

我想这样做是因为他们在函数名称中使用了-

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

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

如何在没有保留字"函数"的情况下定义函数?

你可以在这里找到答案

我也无法理解"['获取天气']"部分。

ES6 引入了这种语法,具有称为计算属性名称的功能,您可以在其中动态定义属性名称。

使用 ES5,不能直接在对象文本中将无效标识符(如 fetch-weather)声明为属性。

ES6:

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

ES5:

var actions = {
    // props here
};
actions['fetch-weather'] = function(sessionId, context, cb) {
    ...
};