如何将箭头功能转换为标准功能?

时间:2019-02-28 00:40:44

标签: javascript function

我有一个箭头功能,由此处的社区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
}

3 个答案:

答案 0 :(得分:5)

您的假设对于外部函数是正确的。其中的第一行将变为:

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

Have a read about Arrow Functions以及它们与常规函数声明的区别。大多数情况下(但不是完全),它们只是语法糖而不是常规功能。

在上下文方面,即this指向函数体内的内容方面,它们之间的区别最为明显。箭头函数始终在声明该函数的外部主流上下文中运行。常规功能,例如通过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; }

hoisting会有所不同,但这超出了此答案的范围。)

从上面我们可以看到的一件事是,=>之后的部分是单个语句,它被解释为返回值,而无需我们实际编写return。 / p>

foo(1); //2

这对于执行在一行代码中可以表示的一项简单功能非常有用。如果需要更多详细功能,请照常将代码放在{}中。

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

这再次与上述foofoo2相同。

因此,最后,打破了那条可怕的线:

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

它说:

  • 将函数分配给局部作用域变量sum
  • 它接受两个参数arrayn
  • 它有一项工作要做,可表达为一行代码,因此不需要为函数体绑定{}。该工作是调用reduce()并(隐式地)返回值
  • reduce的第一个参数,即回调,接受两个争论,aan
  • 此回调与reduce一样,也只有一项工作要做,该工作就是返回a + (an === n)的值

关于糖的最后一个词(您可能已经在上面发现)是,使用箭头功能,如果仅接受单个参数,则无需将其包装在方括号中。但是,有多个参数,并且像往常一样以逗号分隔。

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

希望这会有所帮助。

答案 1 :(得分:4)

该方法使用很多箭头函数,并且可以转换为以下标准函数声明:

SELECT _id, location, day, title, teacher, canceled
     , t.d + "startTime"
     , t.d + "endTime"
FROM   "Schedules" s
, LATERAL (SELECT now()::date + (s.day + 6 - EXTRACT(dow from now())::int) % 7) t(d)
ORDER  BY location, day, "startTime";

答案 2 :(得分:3)

您可以使用https://babeljs.io/将新的javscript编译为“旧” javascript。您可以直接在其主页上尝试。

这是它提供的输出:

  sudo /opt/tyk-gateway/install/setup.sh --dashboard=1 --listenport=8080 --redishost=<hostname> --redisport=6379