arguments并不属于很偏的一个知识点,但我之前一直以为它是一个以实参为元素的数组。实际上arguments
并不是一个数组,而是一个只具有length
属性的类数组,数组的其它方法它都不具备。可以通过.call()
执行silce
方法它转换为数组。 argument
有一个重要的参数callee
指向当前执行的函数本身,也就是说们通过它可以递归执行函数。 例如,使用setTimeout
来实现setInterval,可以这样写:
setTimeout(function(){
//do something
setTimeout(arguments.callee,200);
},200);
复制代码
同时,callee
也可以接收参数:
function add(){
let num = arguments[0]
num++
console.log(num)
if(num<10){
arguments.callee(num)
}
}
add(0)//1,2,3,4,...,10
复制代码
而caller
则是指向当前运行函数的调用者:
function handleAdd(){
let num = arguments[0]
add = function (){
num ++
console.log(num)
console.log(arguments.callee.caller)//function handlerAdd
console.log(arguments.callee.caller==add.caller)//true
}
add()
}
handleAdd(0)
复制代码