JavaScript函数中arguments、callee、caller的使用

函数的参数

  • 函数显式参数在函数定义时列出。
  • 函数隐式参数在函数调用时传递给函数真正的值。
    举个例子:
<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
    
    当我们更改函数名时,就无法完成正常的递归调用了。
    var t = sum;
    sum = function(){
    	return 0;
    }
    console.log(t(5));    //0
    console.log(sum(5));  //0
    
    2、使用arguments.callee解除耦合
    // 使用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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值