Javascript 如何将此箭头函数转换为标准函数?
我有一个箭的功能,这里的社区成员很慷慨地提供了这个功能,但就我个人而言,我无法理解它:Javascript 如何将此箭头函数转换为标准函数?,javascript,function,Javascript,Function,我有一个箭的功能,这里的社区成员很慷慨地提供了这个功能,但就我个人而言,我无法理解它: 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) === su
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
}
该方法使用了大量箭头函数,可以转换为以下标准函数声明:
let isValid = function(arr, arr2) {
let sum = function (array, n) {
return array.reduce(function(a, an) {
return a + (an === n); // coercion -> true = 1, false = 0
}, 0);
};
return !arr2.some(function(n) {
let sum2 = sum(arr2, n);
return !arr.some(function(an) {
return an === n && sum(arr, an) === sum2;
});
});
};
该方法使用了大量箭头函数,可以转换为以下标准函数声明:
let isValid = function(arr, arr2) {
let sum = function (array, n) {
return array.reduce(function(a, an) {
return a + (an === n); // coercion -> true = 1, false = 0
}, 0);
};
return !arr2.some(function(n) {
let sum2 = sum(arr2, n);
return !arr.some(function(an) {
return an === n && sum(arr, an) === sum2;
});
});
};
您可以使用从这个新脚本编译为“旧”javascript。你可以直接在它的主页上试试
以下是它给出的输出:
var isValid = function isValid(arr, arr2) {
var sum = function sum(array, n) {
return array.reduce(function (a, an) {
return a + (an === n);
}, 0);
};
return !arr2.some(function (n) {
return !arr.some(function (an) {
return an === n && sum(arr, an) === sum(arr2, n);
});
});
};
您可以使用从这个新脚本编译为“旧”javascript。你可以直接在它的主页上试试
以下是它给出的输出:
var isValid = function isValid(arr, arr2) {
var sum = function sum(array, n) {
return array.reduce(function (a, an) {
return a + (an === n);
}, 0);
};
return !arr2.some(function (n) {
return !arr.some(function (an) {
return an === n && sum(arr, an) === sum(arr2, n);
});
});
};
对于外部函数,您的假设是正确的。其中的第一行是:
function sum(array, n) {
return array.reduce(function(a, an) {
return a + (an === n);
}, 0);
以及它们与传统函数声明的区别。大多数情况下(但不完全),它们只是语法上的糖类和常规功能
它们在上下文方面差异最大,即此
指向函数体内部的内容。Arrow函数始终在声明函数的外部流行上下文中运行。传统函数,例如通过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
- 这个回调,就像reduce的回调一样,也只有一个任务要做,这个任务就是返回
a+(an==n)
let foo = single_arg => alert(1);
let foo2 = (arg1, arg2) => alert(2);
希望这有帮助。您的假设对于外部函数是正确的。其中的第一行是:
function sum(array, n) {
return array.reduce(function(a, an) {
return a + (an === n);
}, 0);
以及它们与传统函数声明的区别。大多数情况下(但不完全),它们只是语法上的糖类和常规功能
它们在上下文方面差异最大,即此
指向函数体内部的内容。Arrow函数始终在声明函数的外部流行上下文中运行。传统函数,例如通过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
- 这个回调,就像reduce的回调一样,也只有一个任务要做,这个任务就是返回
a+(an==n)
let foo = single_arg => alert(1);
let foo2 = (arg1, arg2) => alert(2);
希望这有帮助。用
函数(arr,arr2)
替换(arr,arr2)=>
。重复同样的模式。等等,我是这个的创造者。事实上,你是!我再次为此感谢你,我很难为情地说你的技术远远超过我自己。我只需要一个更标准的翻译,这样我就可以从中学习并扩展我的能力