簡體   English   中英

如何將箭頭功能轉換為標准功能?

[英]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;
};

再次與上面的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);

希望這可以幫助。

該方法使用許多箭頭函數,並且可以轉換為以下標准函數聲明:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM