【问题标题】:ES6 Assign a variable with an arrow functionES6 用箭头函数赋值变量
【发布时间】:2016-05-14 14:53:47
【问题描述】:

我刚刚开始习惯 ES6 语法,我想知道是否可以使用箭头函数分配给变量。我正在编写一个基本的轻量级 AJAX 帮助程序库,状态为 200,我想向用户返回一个有效负载,我目前正在这样做:

var responseData = "";
switch (payload.returnType.toLowerCase()) {
    case "json" : responseData = JSON.parse(httpRequest.responseText); break;
    case "text" : responseData = httpRequest.responseText; break;
    default : responseData = null; break;
}
callback(null, responseData);

这很好,但我不禁想如果我这样做的话,我可以把它弄得更干净:

callback(null, () => { switch(payload.returnType.toLowerCase()) { ... });

我希望 return 语句将表达式的结果作为回调中的第二个参数发送,但是当我从调用者控制台登录时,它会打印 switch 语句。

或者我已经尝试过:

var responseData = () => {
    switch (payload.returnType.toLowerCase()) {
        case "json" : return JSON.parse(httpRequest.responseText); break;
        case "text" : return httpRequest.responseText; break;
        default : return null; break;
    }
}
callback(null, responseData);

在这种情况下,responseData 始终为空。是否可以将返回值作为我的第二个参数,或者将其绑定到 responseData 作为箭头函数的结果?

【问题讨论】:

  • 您创建了一个函数,但没有执行该函数。
  • 你还必须实际返回一些东西——如果你不使用 {},你不需要返回,但是由于你的函数有 () => {},你需要返回你想要的值。
  • @NetaMeta 是的,对不起,我复制并粘贴了答案中的第一个块,我知道我需要从函数返回分配:)
  • 对于您的callback(null, () => { switch(payload.returnType.toLowerCase()) { ... });,如果您像这样执行它,这也将起作用:callback(null, (() => { switch(payload.returnType.toLowerCase()) { ... }));
  • 只是为了说清楚:需要执行函数才能获得返回值。

标签: javascript ecmascript-6


【解决方案1】:

您创建了一个匿名函数但不执行它。

例如:

var getResponseData = () => {
    switch (payload.returnType.toLowerCase()) {
        case "json" : return JSON.parse(httpRequest.responseText); 
        case "text" : return httpRequest.responseText; 
        default : return null;
    }
};
callback(null, getResponseData());

【讨论】:

  • 谢谢,这工作得很好,然后如果我想在回调的参数中执行它,我会用(() => { ... })(); 将它称为闭包,对吗?
【解决方案2】:

使用自动执行功能更短:

const res = (() => {
  return 'something'
})()

如果是单行的话,甚至更短:

const res = (() => 'something')()

或使用您的代码:

var getResponseData = (() => {
    switch (payload.returnType.toLowerCase()) {
        case "json" : return JSON.parse(httpRequest.responseText); 
        case "text" : return httpRequest.responseText; 
        default : return null;
    }
})();

这个sn-p可以很明显的看出区别:

const res1 = () => {
  return 'something'
}

const res2 = (() => {
  return 'something'
})()

const res3 = (() =>  'short something')()

console.log(res1)
console.log(res2)
console.log(res3)

【讨论】:

    【解决方案3】:

    我认为你的预感是正确的,但你走错了路,恕我直言。我认为您想要做的是创建响应类型到回调的映射:

    let parsers = new Map([
        ["json", JSON.parse], 
        ["text", (text) => text], 
        ["_", () => null]
    ]), t = payload.returnType.toLowerCase();
    
    if (!parsers.has(t)) {
       t = "_";
    }
    callback(null, parsers.get(t)(httpRequest.responseText))
    

    使这在主观上更“干净”的原因是您将逻辑与实现分开。您可以将解析器定义移动到任何地方,而不会影响代码。这就是为什么 switch 语句感觉“不起作用”(或非声明性)的原因。

    当然,这一切都只是个人喜好问题 :)

    【讨论】:

    • 如果我使用这个,我会得到Iterator value json is not an entry object
    • 我是在脑海中打出来的,让我检查一下编码错误。 (编辑):哦等等我已经看到第一个错误,这些对也应该包含在一个数组中。
    • 谢谢,我现在正在阅读 Map 上的 MDN 文档,我真的更喜欢这种方式而不是无聊的开关...现在可以工作了,再次感谢!
    • 是的,我认为在 Map 构造函数的参数周围添加数组外壳是唯一的错误。
    • Map 与计划旧哈希相比有什么优势?
    猜你喜欢
    • 2018-01-08
    • 2019-10-21
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2022-01-21
    • 2016-03-25
    相关资源
    最近更新 更多