簡體   English   中英

引用函數與調用函數之間的區別(this.myFunc與this.myFunc())

[英]The difference between referring to a function and calling it ( this.myFunc vs this.myFunc() )

有人可以解釋調用方法(exp:this.myFunction())和引用方法(exp:this.myFunction)之間的區別嗎?

區別與城鎮(在您的情況下為調用函數)和指向該城鎮的標牌(指功能)之間的區別完全相同

myFunc()執行該函數。 myFunc是該函數的指針

雖然@Cid的答案是絕對正確的,但我還是想添加更多細節。


函數用於在更大的程序中創建子程序 ,從而可以以可重用的方式編寫重復性任務。 為了顯示:

const increment = number => number + 1;

在這里, increment是對(一個匿名函數,例如lambda )函數的綁定,該函數采用一個值並將其加1

是的,很好。 我已經知道了

您可能不知道的事情:在JavaScript中,函數是“一流的對象”。 這意味着,也可以像其他任何變量一樣傳遞函數。 例如,可以將一個函數作為參數傳遞給另一個函數 考慮Array.prototype.map

let numbers = [1, 2, 3];

numbers.map(increment); // -> [2, 3, 4]

為了更詳細地說明這一點,這是一個map函數的實現,該函數不依賴Array.prototype.map而是模仿它:

const map = (funcReference, arrayOfXs) => {
  const result = [];
  for (let i = 0; i < arrayOfXs.length; i += 1) {
    result.push(funcReference(arrayOfXs[i]));
  }
  return result;
}

注意:完全等效的map將需要將當前索引位置作為第二個參數,並將完整的數組作為funcReference第三個參數funcReference

如果我們用它重寫Array.prototype.map示例,代碼將變為:

map(increment, numbers); // -> [2, 3, 4]

可以,但是不能回答我的問題

我們正在努力。 讓我們拆除map以了解發生了什么。

這里要注意的第一件事是, map將函數引用作為第一個參數(就像Array.prototype.map一樣),但這只是指向要調用/執行/應用的函數的指針 ,因此不調用該函數在那個時候

const map = (funcReference, arrayOfXs) =>
//           ^^^^^^^^^^^^^
//           points to increment

打個比方,可以將其視為食譜:如果您將食譜傳遞給廚師,那么一旦通過食譜就不會立即烹飪餐點。 相反,廚師必須執行其中的指令。 指針就像傳遞配方,而調用執行指令。

執行發生在這一行:

result.push(funcReference(arrayOfXs[i]));
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//               execute increment

所有這些在混凝土中意味着什么? 這意味着解釋器了解到, 每次在map內部看到funcReference ,都可以將其替換為increment 它將呼叫map(increment, numbers) 為就像您編寫的那樣:

const result = [];
for (let i = 0; i < numbers.length; i += 1) {
  result.push(increment(numbers[i]));
}

如果我們擺脫了for循環,它將變成:

const result = [];
result.push(increment(1));
result.push(increment(2));
result.push(increment(3));

我們可以進一步簡化:

const result = [];
result.push(1 + 1);
result.push(2 + 1);
result.push(3 + 1);

希望這可以澄清一些事情。


有關功能的更多信息,請查看以下MDN頁面:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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