Machen Sie es einfach:
x.map(function(s) { return s.trim() });
Der Grund, warum der erste nicht funktioniert, ist, dass die Zeichenfolge als Argument an den Rückruf und nicht als Kontext übergeben wird. Wenn Sie kein Argument an übergeben apply
, erhalten Sie dieselbe Nachricht, die Sie erhalten hätten
var f = String.prototype.trim.apply; f.call();
Nehmen wir an, Sie sind hauptsächlich zum Spaß nicht zufrieden mit der Tatsache, dass Sie map
den Rückruf auf diese Weise verwenden, und möchten eine Funktion über den Kontext und nicht über das Argument übergeben können.
Dann könnten Sie dies tun:
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));
Ich sagte "hauptsächlich zum Spaß", weil das Ändern von Objekten, die Sie nicht besitzen (Arrays Prototyp hier), allgemein als schlechte Praxis angesehen wird. Sie können aber auch eine nützliche Funktion ausführen, indem Sie sowohl das Array als auch den Rückruf als Argumente verwenden.
fun
das hätte die gleiche Bedeutung mitfunction(x) { return fun(x); }
.