由于某些原因,我无法使用String.prototype.trim.call
作为数组方法的回调,例如map
或filter
。
在这种情况下,两个函数的工作方式相同:
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
没有指向数组元素,但我想清楚地解释发生了什么。
答案 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