【问题标题】:Converting ECMAScript 6's arrow function to a regular function [duplicate]将 ECMAScript 6 的箭头函数转换为常规函数 [重复]
【发布时间】:2016-10-06 16:42:31
【问题描述】:

我有如下箭头函数

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

rowCheckStatuses 是一个 1 和 0 的数组,这个箭头函数将它们全部相加以产生一个数字。这个数字作为一个布尔值来确定数组中是否至少有一个“1”。

问题是,我并不真正了解箭头函数的工作原理,而且我的 IDE 认为这是错误的语法,并拒绝检查我文档的其余部分是否存在语法错误。

如何将其转换为常规函数以缓解这两个问题?

【问题讨论】:

  • function(a, b) { return a+b; }
  • 显然不是重复的。 OP 询问如何将 => 转换为常规函数。
  • @le_m 如果他们理解它们,那将是微不足道的。
  • 您使用的是哪个 IDE?

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

用常规函数替换箭头函数通常没有问题:

var f = x => y;
var g = function(x) { return y; }

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

rowCheckStatuses.reduce((a, b) => a + b, 0);
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0);

但是,请注意例外情况

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

function MyClass() {}
MyClass.prototype.f = () => this;
MyClass.prototype.g = function() { return this; }

myClass = new MyClass();
console.log(myClass.f()); // logs `Window`
console.log(myClass.g()); // logs `myClass`

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

function test() {

  var f = () => arguments;
  var g = function() { return arguments; }
  
  console.log(f()); // logs test's arguments
  console.log(g()); // logs g's arguments
}

test('x');

new.targetsuper 也是如此。另见What are the differences (if any) between ES6 arrow functions and functions bound with Function.prototype.bind?

【讨论】:

    【解决方案2】:

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

    (<args>) => <body>
    

    function(<args>) { return <body>; }
    

    所以你的应该是

    rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0)
    

    此规则有一些例外,因此如果您想了解所有差异,请务必阅读arrow functions。您还应该注意箭头函数有一个词法this

    【讨论】:

      【解决方案3】:

      您可以将其重构为:

      if( rowCheckStatuses.reduce(function(a, b){return a + b}, 0)
      

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

      if( rowCheckStatuses.reduce(function(a, b){return a + b})
      

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

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

      if( rowCheckStatuses.some(function(a){return a == 1}))
      

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

      if( rowCheckStatuses.indexOf(1) != -1)
      

      很多选择。

      【讨论】:

      • 这在技术上并不完全等同。如果从箭头函数更改为函数表达式,则会丢失词法 this。在这种情况下,这并不重要,因为函数没有引用 this。但请记住这一点。好消息是它很简单 - 只需在函数中添加 .bind(this)
      • @JoeAttardi—好点,但正如你所说,词法 this 在这种情况下不相关。 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多