По-перше, зробіть це просто:
x.map(function(s) { return s.trim() });
Тоді, причина, по якій перший не працює, полягає в тому, що рядок передається як аргумент зворотного виклику, а не як контекст. Коли ви не передаєте жодного аргументу apply, ви отримуєте те саме повідомлення, що і з вами
var f = String.prototype.trim.apply; f.call();
Тепер, в основному для розваги, припустимо, ви не задоволені тим, що mapвикористовуєте зворотний виклик таким чином, і ви хочете мати можливість передавати функцію, використовуючи контекст, а не аргумент.
Тоді ви можете зробити це:
Object.defineProperty(Array.prototype, "maprec", {
value: function(cb){
return this.map(function(v){ return cb.call(v) })
}
});
console.log([' aa ', ' bb '].maprec(String.prototype.trim));
Я сказав "в основному для розваги", оскільки модифікація об'єктів, якими ви не володієте (прототип Array тут), широко розглядається як погана практика. Але ви також можете зробити утилітарну функцію, приймаючи як аргумент як масив, так і зворотний виклик.
funбуде мати те саме значенняfunction(x) { return fun(x); }.