// 1. 相当于一个变量 arguments,因此会抛出引用错误
console.log(arguments) // ReferenceError: arguments is not defined
// 2. 非严格模式下,可将其作为变量
let arguments = 1 // or arguments = 'any'
console.log(arguments) // 1
// 3. 严格模式下,还是将其声明变量或对其进行赋值操作
'use strict'
arguments = 1 // Wrong, SyntaxError: 'arguments' can't be defined or assigned to in strict mode code
在箭头函数内,没有 arguments 变量。例如以下这样使用同样会报错。
const foo = () => {
console.log(arguments) // ReferenceError: arguments is not defined
}
foo()
简述
arguments
是函数实参对象,常被称为“类数组”(array-like)。形如:arguments
的一些特性:类数组对象的特征:含有
length
属性、索引元素属性,但不包含数组任何方法。常见的类数组,除了
arguments
之外,还有HTMLCollection
(通过getElementsByName()
等返回的 DOM 列表)、NodeList
(通过querySelectorAll()
返回的节点列表)。arguments 使用
arguments
通常用于不能确定实参个数的应用场景,例如函数柯里化等。它还经常被转换为数组使用。
像
Function.prototype.apply()
、Array.prototype.slice()
等方法也可接受类数组,无需转换为数组再进行操作。举个例子:都 2021 年了,更被推荐按 ES6 的写法。
注意点
关于
arguments
只能在所有(非箭头)函数内部可用的局部变量。在函数外使用会抛出
ReferenceError
。此时它就是一个标识符而已。在箭头函数内,没有
arguments
变量。例如以下这样使用同样会报错。但这样用不会报错,这就是前面提到的“视觉认知”错误。
非严格模式与严格模式,对
arguments
对象的操作。求和函数(柯里化)
假设我们有一个求和函数
sum()
,要实现下面的需求:其实上面的需求是有问题的,它没有出口,导致不知道什么时候求和。我们可以稍微改下需求:
就是说
sum()
函数的结束时机(出口)是调用value()
方法的时候。也可以改成调用
sum(1, 2)(3)(4)()
时进行求和,我们修改一下:The end.