2016-02-09 5 views
0

Извините, если я что-то пропустил, но когда я пытаюсь использовать метод вызова в качестве обратного вызова, он приносит мне странную ошибку как в Chrome, так и в Node.js.Метод function.call как обратный вызов

[' foo', ' bar '].map(String.prototype.trim.call); 
TypeError: [" foo", " bar "].map is not a function 
at Array.map (native) 

Но эти фрагменты работы:

[' foo', ' bar '].map(function (item) { 
    return String.prototype.trim.call(item); 
}); // => ['foo', 'bar'] 
/* 
    and ES2015 
*/ 
[' foo', ' bar '].map(function() { 
    return String.prototype.trim.call(...arguments); 
}); // => ['foo', 'bar'] 

Также я проверил тип call функции:

typeof String.prototype.trim.call; // => 'function' 

я делаю что-то не так? Может ли кто-нибудь объяснить мне, почему я получаю такую ​​ошибку? Благодарю.

ответ

0

Самое простое решение вашей проблемы просто написать это:

[' foo', ' bar '].map(s => s.trim()); 

Если вы хотите, чтобы передать функцию, вам нужно что-то более сложное, чем вы хотите, вдоль линий

.map(Function.call.bind(String.prototype.trim)) 

или, если вы предпочитаете

.map(Function.call, String.prototype.trim) 

This question может ответить на все йо ур.

+0

Спасибо за ответ. Первый со связью дает мне ту же ошибку, что и выше. Второй работает. – Ermon

+0

@Ermon: Он хотел связать 'call' с' trim' :-) – Bergi

+0

в сторону: '['foo', 'bar'] .map (eval.call," ".trim)' - это короткий способ сказать что. – dandavis

Смежные вопросы