[英]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.