arguments 函数参数集合
在每一个函数都存在一个arguments,arguments是一个类数组对象,它具有数组length属性,通过在函数调用arguments,我们可以获取函数参数,即使函数没有设置形参,我们也可以通过arguments获取到实参。
可以类似数组使用for循环进行遍历
function Fn() {
for(let i = 0;i<arguments.length;i++) {
console.log(arguments[i])
}
}
Fn(1,2,3,4,5,6,7)
通过typeof我们可以看出arguments类型本身依旧是对象属性,并不是数组属性,无法调用数组方法,类似push,pop,slice,forEach等等
function Fn() {
console.log(typeof arguments)
}
Fn(1,2,3,4,5,6,7)
将arguments打印出来查看其中的方法,我们可以发现除了函数参数和length属性,arguments存在callee方法和Symbol迭代器。
Symbol迭代,arguments可以通过Symbol迭代器进行迭代
function Fn() {
let iter = arguments[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
}
Fn(1,2,3)
callee方法对应的是返回正在被调用的函数,通过调用arguments.callee,我们可以调用Fn函数
function Fn() {
console.log(arguments.callee==Fn)
}
Fn()
通过使用callee我们可以减少耦合的情况出现,但由于arguments是一个很大的对象,每次访问arguments都需要创建一个对象,消耗内存,影响浏览器性能,因此callee现在不建议推荐使用。
在js开启严格模式下,arguments calle caller被禁止使用,使用会报错。报错内容为:
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
'use strict'
function Fn() {
console.log(arguments.callee)
}
Fn(1,2,3)
如有问题和错误,欢迎大家在评论区下进行讨论和指正。