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

标签 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 不指向数组元素,但我想清楚地解释发生了什么。

最佳答案

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

当您在第一种情况下调用 call 方法时,它的 this value绑定(bind)到 String.prototype.trim 函数。在第二种情况下,您只需访问 call 函数,而无需将其绑定(bind)到任何东西——您可以只使用

array.map(Function.prototype.call)

此方法被调用时没有作为 this 值、数组中的元素、索引和整个数组作为参数。当您不在函数上调用 call 时,它会抛出。您可以使用 map 的第二个参数或 bind method修复 调用this 值:

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

关于javascript - 不能使用 String#trim 作为 Array#map 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21186398/

相关文章:

javascript - 如何在asp.net中使用javascript显示和上传图像?

JavaScript 全局对象和全局作用域

c - 寻求更好地理解 C 中的 strstr 函数

javascript - 经典与原型(prototype)……它们有何不同?

javascript - 多次评估或加载远程脚本

javascript - 在 JavaScript 中可以声明一个新的子类作为原型(prototype)方法吗?

javascript - Jquery 上下文不从 ajax 请求返回现有元素

javascript - 常规 JavaScript 可以与 jQuery 混合使用吗?

javascript - 如何在javascript中获取字符串的第一个字母单词

c++ - 对大字符串进行更快的操作