javascript函数之arguments学习
js函数有两个特殊的对象,一个是this,另一个是arguments。
示例代码
function say(a1,a2,a3){
console.log(arguments);
}
say(1,2,3);
输出
(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
从上面输出内容可以看出,arguments类似一个数组,其实小的乍一看就是一个数组,但是书上说这是一个类数组对象,小的也没太搞明白什么意思,估计又能通过索引取值,又有内部方法吧。
arguments的主要用途是保存函数的所有参数
function say(a1,a2,a3){
console.log(arguments[0])
console.log(arguments[1])
console.log(arguments[2])
console.log(arguments[3])
}
say(1,2,3);
-------->输出:
1
2
3
undefined
因为在调用函数say时只传递了三个参数,所以我们最后稳稳地只取出了三个参数的值
当然,arguments保存的不是函数声明的参数,而是真正调用时所传递的参数。
function say(a1,a2){
console.log(arguments[0])
console.log(arguments[1])
console.log(arguments[2])
console.log(arguments[3])
}
say(1,2,3);
-------->输出:
1
2
3
undefined
arguments.callee是函数本身
可能我的语义不准确,但是应该应该能够帮助同学们理解一二
示例
function say(a){
console.log(a)
if (a>1) {
arguments.callee(a-1);
}
}
say(2);
-------->输出:
2
1
诶,这不就是递归吗?这有什么鸟用啊?
俗话说存在就有它的意义,下面我们来看这个示例,使用方法名递归
function say(a){
console.log(a)
if (a>1) {
say(a-1)
}
}
newSay = say
say = function (){
console.log('我变成了其他函数')
}
newSay(2)
-------->输出:
2
我变成了其他函数
看到这里相信大家可以理解,在程序运行后看,say已经不指向原来的函数了,它变了。
所以,这个时候,我们的arguments.callee就能缓解这种尴尬了
function say(a){
console.log(a)
if (a>1) {
arguments.callee(a-1)
}
}
newSay = say
say = function (){
console.log('我变成了其他函数')
}
newSay(2)
-------->输出:
2
1