簡體   English   中英

將Function.prototype.call生成的函數作為參數傳遞時,Array.prototype.map不是函數

[英]Array.prototype.map is not a function when passing a function generated by Function.prototype.call as argument

有時我像這樣使用Array.prototype.map方法:

var array = ['1', '2', '3', '4'].map(parseFloat); // the result is [1, 2, 3, 4]

parseInt接受2個參數,在這種情況下返回不正確的值

現在我要做的是代替這段代碼:

var  array = ['a', 'b', 'c', 'd'].map( function (item) { 
    return item.toUpperCase(); 
}); // the result is ['A', B', 'C', 'D']

我試過這個:

var array = ['a', 'b', 'c', 'd'].map(''.toUpperCase.call);

有人可以向我解釋為什么我會收到一條錯誤消息:

未捕獲的TypeError:[“a”,“b”,“c”,“d”] .map不是函數

第一個問題是你傳遞函數''.toUpperCase.apply它與 Function.prototype.apply 相同 :它沒有綁定。

會發生什么相當於

['a', 'b', 'c', 'd'].map(function(v, i, arr){
   return undefined.apply(v, i, arr)
});

如果你使用綁定它

['a', 'b', 'c', 'd'].map(''.toUpperCase.apply.bind(''.toUpperCase));

那么你有第二個問題: map不會只將一個參數傳遞給你的回調。 它還傳遞索引和整個數組。

你可以“解決”這兩個問題

['a', 'b', 'c', 'd'].map(function(v){ return ''.toUpperCase.apply(v) });

(更多解釋而不是修復,對吧)

使用call更容易, 可以修復:

var arr = ['a', 'b', 'c', 'd'].map(''.toUpperCase.call.bind(''.toUpperCase));

應該寫成

var arr = ['a', 'b', 'c', 'd'].map(Function.prototype.call.bind(''.toUpperCase));

旁注:你很幸運在第一個例子中使用了parseFloat 嘗試使用parseInt

''.toUpperCase.call傳遞給Array.map ,盡管它會正確傳遞參數,但call函數會從toUpperCase函數中解體,該函數保存實現細節。

所以,現在Function.call確實有Array.map回調函數傳遞給它的正確參數,但它沒有引用''.toUpperCase函數。

MDN:您可以在調用現有函數時分配不同的this對象。 this指的是當前對象, 即調用對象

所以''.toUpperCase.call("a")call("a")完全不同,這是將''.toUpperCase.call傳遞給Array.map時發生的情況。

暫無
暫無

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

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