函数在没有大括号的情况下也能正常工作,并且不能与大括号一起工作,为什么?

Function works withouth curly braces and doesn't work with them, why?

我正在做 FreeCode 训练营练习,这让我的头脑混乱了:

const squareList = arr =>
  arr
    .filter(num => num > 0 && num % parseInt(num) === 0)
    .map(num => Math.pow(num, 2));

const squaredIntegers = squareList([4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]);

console.log(squaredIntegers);

这可以正常工作,但如果我输入:

 const squareList = arr => {
      arr
        .filter(num => num > 0 && num % parseInt(num) === 0)
        .map(num => Math.pow(num, 2));
    }
    const squaredIntegers = squareList([4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]);

    console.log(squaredIntegers);

在很多函数中正常使用的典型大括号,它不起作用。为什么?

一个是一组statements(带花括号),另一个是expression

(param1, param2, …, paramN) => { statements } // needs to return something
(param1, param2, …, paramN) => expression
// equivalent to: => { return expression; }

所以当你使用第一种形式时,你需要return从中得到一些东西

所以在你的非工作案例中它应该是一个 return 语句

const squareList = arr => {
     return arr
        .filter(num => num > 0 && num % parseInt(num) === 0)
        .map(num => Math.pow(num, 2));
    }

Any unit of code that can be evaluated to a value is an expression.

A statement is an instruction or set of instructions to perform a specific action

mozilla docs

中有更详细的解释

没有大括号,return为您添加。

带花括号的,需要自己加上。


const squareList = arr => {
    return arr
        .filter(num => num > 0 && num % parseInt(num) === 0)
        .map(num => Math.pow(num, 2));
}
const squaredIntegers = squareList([4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]);

console.log(squaredIntegers);

将正常工作。

无论好坏,javascript 允许箭头函数是

中的一种形式
args => expression

args => function_body

所以它们 "straddle the line" 在必须有函数体的老式 Javascript 闭包 (function (arglist...) {...}) 和更纯函数式语言中的 lambda 之间,它们总是采用表达式.

您的工作示例的形式为 args => expression,但如果您在表达式两边加上大括号,它会被解释为 args => function_body。但是一个没有return语句的函数体returns undefined。这很容易通过添加 return 关键字来解决,因为 args => expression 实际上是 shorthand 的函数 returns what表达式的计算结果为。

args => {return expression}

请注意,如果您想要一个 expression 应该是对象字面量的箭头函数,这种语法歧义也会导致问题;在那种情况下你必须说

args => ({
    // object key/value pairs
})

(注意额外的 () 会阻止编译器认为您提供的是函数体)。