函数在没有大括号的情况下也能正常工作,并且不能与大括号一起工作,为什么?
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
中有更详细的解释
没有大括号,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
})
(注意额外的 () 会阻止编译器认为您提供的是函数体)。
我正在做 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
没有大括号,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
})
(注意额外的 () 会阻止编译器认为您提供的是函数体)。