首页 > 解决方案 > 如何将此箭头函数转换为标准函数?

问题描述

我有一个箭头功能,由社区的Ele提供,但对于我的生活,我无法理解:

let isValid = function (arr, arr2) {
    let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);  
     return !arr2.some(n => !arr.some(an => an === n && sum(arr, an) === sum(arr2, n)))
};

有人会这么好心地将其翻译成标准功能,以便我可以在我的技能水平上遵循它吗?

谢谢你。

我的假设:

function isValid (arr, arr2) {
    ...this is where i'm lost
}

标签: javascriptfunction

解决方案


您的假设对于外部函数是正确的。它里面的第一行会变成:

function sum(array, n) {
    return array.reduce(function(a, an) {
        return a + (an === n);
    }, 0);

阅读箭头函数以及它们与传统函数声明的区别。大多数(但不完全),它们只是语法糖与传统功能。

它们在上下文方面最显着不同,即this指向函数体内部的内容。箭头函数总是在声明函数的外部主流上下文中运行。常规功能,例如 via bind(),可以重新指向不同的上下文。

let foo = function() {
    let bar = () => this;
    return bar();
}.bind('a');
foo(); //'a', because foo()'s context is 'a'

那么那颗糖呢?起初它可能看起来令人困惑,尤其是当您在一行中有多个箭头函数时。要记住的关键一件事是,它们只是您过去必须手动编码的内容的隐式速记。

let foo = a => a+1;

是相同的

function foo2(a) { return a + 1; }

提升会有所不同,但这有点超出了这个答案的范围。)

从上面我们可以看出的一件事是,后面的部分=>是单个语句,它被解释为返回值,而我们不必实际编写return.

foo(1); //2

这对于在一行代码中完成一项工作的简单函数非常有用。如果您需要更详细的函数,您可以{}像往常一样将代码包含在其中。

let foo3 = a => {
    return a+1;
};

这再次foofoo2上述相同。

所以,最后,打破这条可怕的线:

    let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);  

它说:

  • 将函数分配给局部范围变量sum
  • 它接受两个参数,array并且n
  • 它有一项工作要做,可以用一行代码表示,因此不需要绑定{}函数体。该工作是调用reduce()并(隐式)返回值
  • 回调的第一个参数reduce接受两个参数,a并且an
  • 这个回调,就像一个 to reduce,也只有一个工作要做,那个工作就是返回值a + (an === n)

关于糖的最后一句话,你可能已经在上面发现了,那就是,对于箭头函数,如果只接受一个参数,你不需要将它括在括号中。但是,多个参数像往常一样以逗号分隔。

let foo = single_arg => alert(1);
let foo2 = (arg1, arg2) => alert(2);

希望这可以帮助。


推荐阅读