[英]How can I convert this arrow function to a standard 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
}
您的假設對於外部函數是正確的。 其中的第一行將變為:
function sum(array, n) {
return array.reduce(function(a, an) {
return a + (an === n);
}, 0);
閱讀有關箭頭函數及其與常規函數聲明的區別的信息。 大多數情況下(但不是完全),它們只是語法糖與常規功能。
它們在上下文方面(即, 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; }
( 吊裝方式會有所不同,但這超出了此答案的范圍。)
從上面我們可以看到的一件事是, =>
之后的部分是單個語句,它被解釋為返回值,而無需我們實際編寫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);
希望這可以幫助。
該方法使用許多箭頭函數,並且可以轉換為以下標准函數聲明:
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;
});
});
};
您可以使用https://babeljs.io/將新的javscript編譯為“舊” 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);
});
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.