不能使用String#trim作为Array#map的回调

时间:2014-01-17 12:47:15

标签: javascript string prototype

由于某些原因,我无法使用String.prototype.trim.call作为数组方法的回调,例如mapfilter

在这种情况下,两个函数的工作方式相同:

function trim(string) {
  return string.trim();
}

var string = ' A ';

trim(string);                       // 'A'
String.prototype.trim.call(string); // 'A'

但是,当我尝试将它们作为数组方法的回调传递时,第二个失败了:

var array = [' A', 'B ', ' C '];

array.map(trim);                       // ['A', 'B', 'C'];
array.map(String.prototype.trim.call); // TypeError: undefined is not a function

演示:http://jsbin.com/ubUHiHon/1/edit?js,console

我假设在后一种情况下this没有指向数组元素,但我想清楚地解释发生了什么。

1 个答案:

答案 0 :(得分:9)

String.prototype.trim.call(string); // 'A'
array.map(String.prototype.trim.call); // TypeError: undefined is not a function

在第一种情况下调用call方法时,其this value绑定到String.prototype.trim函数。在第二种情况下,您只需访问call函数而不必将其绑定到任何内容 - 您可以使用

array.map(Function.prototype.call)

这个方法被调用,没有任何内容作为this值,数组中的元素,索引和整个数组作为参数。当您在某个函数上调用call时,它会抛出。您可以使用map的第二个参数或bind method来修复this的{​​{1}}值:

call