簡體   English   中英

如何將原型上定義的方法傳遞給Array.map作為回調

[英]How to pass the method defined on prototype to Array.map as callback

我有一個陣列

var arr = [' A ', ' b ', 'c'];

我想從數組中trim每個元素的空格。

可以使用Array.map作為

arr.map(function(el) {
    return el.trim();
});

我很好奇將trim / toLowerCase函數直接傳遞給map作為回調函數,如arr.map(Math.max.apply.bind(Math.max,null)); 從每個子數組arr.map(Number)獲取最大元素; 將每個元素轉換為Number。

我試過了

arr.map(String.prototype.trim.apply);

但這是投擲錯誤

未捕獲的TypeError:在undefined上調用了Function.prototype.apply,這是一個未定義的而不是函數

我希望應該為數組中的每個元素調用String.prototype.trim.apply ,並將上下文設置為array中的元素(傳遞給apply );

我也嘗試過applycallbind不同組合,但沒有成功。

  1. 為什么使用map時無法引用原型上的函數
  2. 函數如何作為參數傳遞給map
arr.map(String.prototype.trim.call.bind(String.prototype.trim));

call this內部使用this ,在這種情況下必須指向trim函數才能正常工作。 只需傳遞String.prototype.trim.call就可以將call解除綁定到任何方法,從而導致this值指向window

它可以工作,但是當使用apply而不是call它拋出錯誤時,arr.map(String.prototype.trim.apply.bind(String.prototype.trim));

問題是map將傳遞2個參數,即項和索引。 因此,它最終會調用類似'String.prototype.trim.apply('test', 0) ,因為第二個參數必須是數組才會失敗。

還有一件事['A','B','c']。map(String.prototype.trim.call.bind(String.prototype.toLowerCase));,在這里,我使用了trim.call並傳遞了toLowerCase作為上下文然后為什么我們需要修剪這里,為什么不調用trim

使用call.bind ,您選擇訪問call函數引用的路徑變得無關緊要。 將被調用的函數是綁定的函數。

如果要將功能組合在一起,則需要采用不同的方法:

var call = Function.prototype.call,
    trim = call.bind(String.prototype.trim),
    toLowerCase = call.bind(String.prototype.toLowerCase),
    trimAndLowerCase = pipelineFrom(trim, toLowerCase);

[' TeST '].map(trimAndLowerCase);

function pipelineFrom(fn1, fn2) {
    return function (val) {
        return fn2(fn1(val));
    };
}

但是在這一點上你最好用:

arr.map(function (val) {
    return val.trim().toLowerCase();
});

這有效,但肯定是啰嗦:

var t = String.prototype.trim.call.bind(String.prototype.trim);
arr.map(t);

因為它很長,所以有博客文章模塊專門用於解決,這就是你想要做的事情。

我曾經在這里問過這件事 ......

暫無
暫無

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

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