【问题标题】:ES6 arrow function returns undefined instead of desired valueES6 箭头函数返回未定义而不是期望值
【发布时间】:2017-12-04 18:22:15
【问题描述】:

在没有 ES6 的 JS 中工作的简单函数:

var evenOrOdd = function(n){
   if(n % 2 == 1){
      return "Odd";
   } else {
      return "Even";
   }
}

console.log(evenOrOdd(3)); //returns odd

我尝试使用 ES6 进行重构:

const evenOrOdd = (n) => {(n % 2 == 1) ? "Odd" : "Even"};

console.log(evenOrOdd(3)); //returns undefined

我在这里遵循这些示例:2alitystoimen

为什么这个箭头函数返回undefined

【问题讨论】:

  • 我还尝试将 const 替换为 var 和 let(只是为了看看),但没有任何改变。
  • 去掉函数体周围的{...}。但是,这与 TCO 无关,因为您的函数不会调用另一个函数。
  • 哦,有趣。我以为 TCO 是?和:--我正在学习。那这叫什么?只是优化?我如何给你“功劳”以帮助我?
  • ... ? ... : ...conditional operator。如果在尾部位置存在 函数调用(基本上意味着函数调用是另一个函数中的最后一个操作),则 TCO 是运行时可以执行的操作。 IE。要使 TCO 发生,必须重构他们的代码以将函数调用置于尾部位置。但这与条件运算符无关。再说一次,不存在任何 TCO,因为您的函数没有调用另一个函数。
  • TCO 在 recursive 函数的上下文中很有用。在您的示例中,将代码从 if 语句更改为条件运算符只是“重构”代码。

标签: javascript optimization ecmascript-6


【解决方案1】:

您必须删除{}

const evenOrOdd = n => (n % 2 === 1 ? "odd" : "even")

console.log(evenOrOdd(3)) //=> "odd"

【讨论】:

  • 或者显式添加return
【解决方案2】:

(可能对其他人有帮助)

我试图从嵌套函数返回一个值,这是错误的

const isEmailExistsInDb = usrEmail => {
    userModel.countDocuments( {"email": usrEmail}, function (err, count){
        return tempCount > 0;
    });
};

正确的是,必须从父函数返回值

const isEmailExistsInDb = usrEmail => {
    let tempCount;
    mongoModel.countDocuments( {"email": usrEmail}, function (err, count){
        tempCount = count;
    });
    // count > 0 if document exists
    return tempCount > 0;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2020-05-06
    • 2016-11-04
    • 2021-11-09
    • 2022-01-20
    • 2021-01-15
    相关资源
    最近更新 更多