【问题标题】:Confused About Resig Curry Example And "arguments" Object对 Resig Curry 示例和“参数”对象感到困惑
【发布时间】:2013-03-26 20:55:34
【问题描述】:

this article,John Resig 讨论了这个用于柯里化的 sn-p:

Function.prototype.curry = function() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function() {
      return fn.apply(this, args.concat(
        Array.prototype.slice.call(arguments)));
    };
  };

我对@9​​87654324@ 的表达感到困惑。

    1234563我不明白该代码如何按原样工作。
  1. 根据the docs on "arguments",“参数”实际上不是一个数组,而只是一个类似对象的数组。我们如何在上面调用“slice()”?如果我输入代码console.log(arguments.slice()),我会收到一条错误消息,指出该对象没有切片方法。

这是怎么回事?

【问题讨论】:

  • Resig voodoo,你所有的代码都属于约翰!
  • @Xander,不,它没有明确讨论,尽管我认为 sn-p 可能来自原型库。

标签: javascript


【解决方案1】:

第一个问题的答案:

如果你在一个不带参数的数组上调用 slice,它只会返回一个数组的副本。 Array.prototype.slice.call(arguments) 做同样的事情,但对 arguments 对象进行操作,返回一个数组。

第二个问题的答案:

我们可以在 arguments 上调用 slice,因为它是一个“通用”方法(参见注释 here)。当您将arguments 对象作为this 传递时,slice 会将其视为一个数组。由于arguments 是一个包含length 属性的array-like object,所以它可以正常工作。

【讨论】:

  • @Pointy:文档按要求列出 startIndex 是否有误? developer.mozilla.org/en-US/docs/JavaScript/Reference/…
  • 看来你评论错了! :) 但我想我知道你的问题的答案:规范说第一个参数转换为带有ToInteger 的 int,当你传递 undefined 时恰好返回 0。见es5.github.com/#x9.4es5.github.com/#x9.3
  • 其实并没有错。你会自动收到通知,但我也必须@Pointy 通知他。所以我只是这样做了,而不是在你的两个答案中都问同样的问题:)
  • @Pointy too:为什么直接在参数对象 not 上调用 slice 有效? jsfiddle.net/Xcn32/1 -- 鉴于 bfavaretto 对我上一条评论的回答,现在一切都清楚了,除了这个谜团仍然存在......
  • @Jonah Pointy 不会收到通知,因为这不是他的答案,他也没有参加这里的 cmets。有关元的更多详细信息:meta.stackexchange.com/questions/43019/…
【解决方案2】:

.slice() 的参数是可选的。如果不存在,该函数只返回原始数组(或类似数组的对象)的副本。

.slice() 函数只关心this 对象上是否存在“长度”属性。因此,因为“参数”确实有一个“长度”属性,.slice() 很高兴。

【讨论】:

  • 尖尖的,请参阅 bfavaretto 对后续问题的回答的 cmets(我对你们俩都有同样的问题)。谢谢。
  • @Jonah 你准备好了吗?看起来 bfavaretto 提供了典型的精彩答案,但请随时提出更多问题。 arguments 对象是个奇怪的东西。
  • 谢谢夸奖!
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2014-11-28
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多