[英]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
);
我也嘗試過apply
, call
和bind
不同組合,但沒有成功。
map
時無法引用原型上的函數 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();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.