【问题标题】:Why doesn't any object prototype work as a forEach callback? [duplicate]为什么任何对象原型都不能用作 forEach 回调? [复制]
【发布时间】:2015-01-14 10:14:27
【问题描述】:

而不是一个问题,我只是希望它是一个挑战,但还没有找到答案。

例如,我们有一个字符串数组

x = ['a', '   b', '  c  ']

我想修剪所有元素。我尝试了applycall 方法,但都没有按预期工作:

x.forEach(String.prototype.trim.call)
// Uncaught TypeError: undefined is not a function

x.forEach(String.prototype.trim.apply)
// Uncaught TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function

这里发生了什么? apply/call 应该从每个函数中获取他们的第一个参数,一切看起来都很好。

【问题讨论】:

  • 这是一个类静态方法的好例子:String.trim = function(s) { return s.trim() }; x = x.map(String.trim)
  • @thefourtheye:你为什么认为它是重复的?
  • @Guffa 这显然是个骗子。不幸的是,.map.forEach 的规范不允许将当前元素作为 this 传递,这与 jQuery 等效项不同。
  • @Guffa 作为操作我确认这是重复的。请参阅已接受答案中的 cmets。作者问的和我问的一样。
  • 好吧,我没有深入了解它。我只是对这显然不是问题本身的重复这一事实作出反应。

标签: javascript prototype declarative-programming


【解决方案1】:

foo.call() 将调用存储在foo 中的函数。

thiscall 中的值将是foo

您传递给forEach 的函数在没有明确上下文的情况下被调用,因此this 的值将是默认对象(浏览器中的window)。

window 不是函数,所以会出错。

您可以使用bind 创建一个新函数,该函数调用具有特定上下文的函数。

【讨论】:

    【解决方案2】:

    试试这个,

    x = ['a', '   b', '  c  ']
    x.map(function(item) { return item.trim() })
    

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2022-01-25
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多