对Resig Curry示例和“参数”感到困惑对象
Confused About Resig Curry Example And "arguments" Object
在本文中,John Resig讨论了curry的代码片段:
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)));
};
};
我对表达Array.prototype.slice.call(arguments)
感到困惑。
这里的"参数"是"this"参数数组的slice()方法,但"slice()"需要一个参数本身,所以我认为你需要做一些像
Array.prototype.slice.call(arguments, <someIndex>)
。我不明白代码是怎么工作的。根据文档上的"参数","参数"实际上不是一个数组,而只是一个类似对象的数组。我们如何在它上面调用"slice()"?如果我输入代码
console.log(arguments.slice())
,我得到一个错误,说对象没有切片方法。
这是怎么回事?
第一个问题的答案:
如果在一个没有参数的数组上调用slice,它将返回该数组的一个副本。Array.prototype.slice.call(arguments)
做同样的事情,但是在arguments
对象上操作,返回一个数组。
第二个问题的答案:
我们可以在arguments
上调用slice,因为它是一个"泛型"方法(见这里的注释)。当您将arguments
对象作为this
传递时,slice
将把它视为一个数组。由于arguments
是一个包含length
属性的类数组对象,因此它可以正常工作。
.slice()
是可选参数。如果没有,则该函数只返回原始数组(或类数组对象)的副本。
.slice()
函数只关心this
对象上是否存在"length"属性。因此,因为"参数"确实有一个"长度"属性,.slice()
很高兴。
- JS for循环来设置HTML对象参数
- 如何在使用javascript加载页面时直接设置对象参数
- 如何将对象参数传递给事件处理程序
- 在ng重复中剪切对象参数的字符串长度
- 在新对象参数中使用“this”选择器
- 在 javascript 中通过引用传递一个对象参数
- 为什么 Javascript 中的参数在使用 console.log 时返回 [对象参数]
- 如何使用 javascript 访问在函数中传递的对象参数
- 在哪里可以获得有关 JavaScript 函数的对象参数语法的信息
- JavaScript 对象参数在通过网络读取时更改
- 我正在寻找一种智能方法来检查传递给函数的对象参数
- 使用来自另一个函数的对象参数调用函数
- Javascript中的对象参数,以及我们应该如何命名它们
- Jquery 在 Firefox 中的自定义对象参数(动态导航加载动态内容)
- 有效记忆对象参数
- AngularJS v1.2.x $digest() 无限循环指令隔离范围对象参数
- 在 Jasmine 中执行有关对象参数的断言
- Jquery - 编辑对象参数
- 检查对象参数是否具有所有必需属性的最有效方法是什么
- Javascript对象参数的分配和使用