javascript - 如何将此箭头函数转换为标准函数?
问题描述
我有一个箭头功能,由社区的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
}
解决方案
您的假设对于外部函数是正确的。它里面的第一行会变成:
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;
};
这再次foo
与foo2
上述相同。
所以,最后,打破这条可怕的线:
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);
希望这可以帮助。
推荐阅读
- android - 将文本居中在父级居中但不在 TextView 中
- html - 悬停效果不会激活其他元素
- java - 如果用户已经在 Java 中进行了身份验证,请让用户在角度屏幕上登录?
- excel - 在 Excel VBA 上尝试“.Insert Shift:=xlDown”会在特定 PC 上出现错误
- python - Python CSV dictReader,没有得到预期的输出
- dialogflow-es - 让 Google 助理听 1 分钟
- python - 如何在 python 中重置 CUDA GPU
- variables - 解释随机变量列表的索引表达式
- python-3.x - 如何在 Python 中创建一个在 3 个索引和 numpy.nan 值之间递增的列表
- c# - 如何使用基于代码的配置在 serilog 中输出紧凑的日志级别