将ECMAScript 6的箭头函数转换为常规函数

sna*_*che 2 javascript ecmascript-6 arrow-functions

我有以下箭头功能

if( rowCheckStatuses.reduce((a, b) => a + b, 0) ){}

rowCheckStatuses是一个1和0的数组,这个箭头函数将它们全部加起来产生一个数字.此数字用作布尔值,以确定数组中是否至少有一个"1".

问题是,我真的不明白箭头功能是如何工作的,我的IDE认为这是错误的语法,并拒绝检查我的文档的其余部分是否存在语法错误.

我如何将其转换为常规功能以缓解这两个问题?

Tha*_*you 7

通常可以通过替换来转换箭头函数

(<args>) => <body>
Run Code Online (Sandbox Code Playgroud)

function(<args>) { return <body>; }
Run Code Online (Sandbox Code Playgroud)

所以你的

rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0)
Run Code Online (Sandbox Code Playgroud)

此规则有例外情况,因此如果您想了解所有差异,请务必阅读箭头功能.您还应该注意箭头函数有词法this.


Rob*_*obG 6

您可以将其重构为:

if( rowCheckStatuses.reduce(function(a, b){return a + b}, 0)
Run Code Online (Sandbox Code Playgroud)

初始累加器不是必需的(除非您希望数组有时为空),它可能是:

if( rowCheckStatuses.reduce(function(a, b){return a + b})
Run Code Online (Sandbox Code Playgroud)

这个数字作为一个布尔值来确定数组中是否至少有一个“1”

使用可能更快(更清晰):

if( rowCheckStatuses.some(function(a){return a == 1}))
Run Code Online (Sandbox Code Playgroud)

如果rowCheckStatuses 中有任何 1 ,它将返回true,并且一旦遇到它就会返回。另一种选择是indexOf

if( rowCheckStatuses.indexOf(1) != -1)
Run Code Online (Sandbox Code Playgroud)

很多替代品。

  • 这在技术上并不完全等效。如果从箭头函数更改为函数表达式,则会丢失词法“this”。在这种情况下,这无关紧要,因为该函数不引用 this。但要牢记这一点。好消息是它很容易 - 只需在函数中添加一个 `.bind(this)`。 (2认同)

le_*_*e_m 5

用常规函数替换箭头函数通常不会出现问题:

var f = x => y;
var g = function(x) { return y; }
Run Code Online (Sandbox Code Playgroud)

或者,在您的具体示例中:

rowCheckStatuses.reduce((a, b) => a + b, 0);
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0);
Run Code Online (Sandbox Code Playgroud)

但是,请注意例外情况

箭头函数不绑定this值。因此,在箭头函数中访问this可能会返回封闭执行上下文的值this

var f = x => y;
var g = function(x) { return y; }
Run Code Online (Sandbox Code Playgroud)

箭头函数也无法访问本地arguments对象。arguments在箭头函数中访问可能会返回arguments封闭函数的 :

rowCheckStatuses.reduce((a, b) => a + b, 0);
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0);
Run Code Online (Sandbox Code Playgroud)

new.target和 也同样如此super。另请参阅ES6 箭头函数和使用 Function.prototype.bind 绑定的函数之间有什么区别(如果有)?