arguments和callee属性

不定参数

很多时候,比如我们要写一个求和的函数,那么如果说知道,参数的情况下,可以这么写。

1
2
3
4
5
6

function sum(a , b) {
let rs = a + b;
console.log(rs)
}

可是,如果不知道呢?比如参数是不确定的,怎么办呢?
这里就要用到 JavaScript的 arguments 对象。

1
2
3
4
5
6
7
8
9
10
11
12

function sum() {
for(let sum = 0, i = 0; i < argumens.length; i+=1) {
sum += argumens[i];
}

console.log(sum);
}

sum(1);
sum(1,2,3); //这样就可以,无限扩充也不怕了

argumens 是一个长得像数组的对象,它是函数调用时的实参列表。当然现在 ES6 有更简单的做法。

1
2
3
4
5
6
7
8
9


function foo( ...rest) {

console.log(rest);
}

foo(1, 2, 3, 4, 5); //[1,2,3,4,5];

上面的方式 是 ES6 新增加的。使用这个方法,可以直接获得实参列表,并以数组方式返回。

collee属性

我们计算0到一百的和,可以用递归的方法。

1
2
3
4
5
6
7
8
9
10
11

function sum(n) {
if (n) {
return n + sum(n-1)
} else {
return 1;
}
}

console.log( sum(100) ); //5050

但是假如现在我们的需求是写一个即时函数呢?这个函数没有名字。

1
2
3
4
5
6
7
(function(n) {
if (n) {
return n + argumens.collee(n-1);
} else {
return 1
}}());