函数的参数
- 函数显式参数在函数定义时列出。
- 函数隐式参数在函数调用时传递给函数真正的值。
举个例子:
<script type="text/javascript">
function test(name,age){
console.log(name+'今年'+age+'岁了!');
}
test('小明',18);
</script>
其中name、age是函数的显式参数。
什么是arguments?
当我们使用console.log(arguments);
在控制台中会输出一个Arguments伪数组(伪数组具有索引值、length属性,但是没有数组的pop、shift、push等方法)
- 简单地来说,arguments保存了调用时传递给函数的所有实参,并且只有函数开始调用的时候才能使用,可以直接通过索引值访问函数的实参。
callee属性的使用
- callee属性,返回正被执行的 Function 对象,该属性实际上是一个指针,指向拥有arguments对象的函数。现有函数如下:
控制台输出结果如下:function test(x,y) { console.log(arguments.callee); } test(1,2);
- 使用callee属性能够解除函数体内的代码与函数名的耦合状态,有利于匿名函数的递归或者保证函数的封装性。
我们用经典的阶乘函数作为例子:
1、普通写法:
当我们更改函数名时,就无法完成正常的递归调用了。//函数主体和函数名紧紧耦合 function sum(n) { if (n <= 0) return 1; else return n*sum(n - 1) } console.log(sum(5)); //120
2、使用arguments.callee解除耦合var t = sum; sum = function(){ return 0; } console.log(t(5)); //0 console.log(sum(5)); //0
无论函数名为什么,我们都能完成正常的递归调用// 使用callee属性,解除耦合 function sum(n) { if (n <= 0) return 1; else return n*arguments.callee(n - 1) } console.log(sum(5)); //120
var t = sum; sum = function(){ return 0; } console.log(t(5)); //120 console.log(sum(5)); //0
caller属性的使用
- caller 属性,返回一个对函数的引用,即调用了当前函数的函数体。
- 如果函数是在全局作用域被调用的,那么 caller返回null,如下:
function test(name,age){ console.log(name+'今年'+age+'岁了!'); console.log(test.caller); //null } test('小明',18);
- 反之,如在一个函数中调用另一个函数:
控制台输出结果如下:function test(name,age){ console.log(name+'今年'+age+'岁了!'); console.log(test.caller); //null } function Father(){ test('小明',18); } Father();
- 为了实现更松散的耦合,我们可以使用
arguments.callee.caller
来替换functionName.caller