本文主要是介绍快速区分callee、caller、apply、call、arguments,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、callee(我是什么)、caller(谁调用我)、arguments(参数列表)
在函数调用时,脚本解释器会自动创建一个arguments参数列表,可将它看作是半个Array对象,因为它虽然具有length属性,并且可以根据序号访问每一个参数,但它没有Array对象的join、shift等方法,而且最重要的是它具有两个非常重要的特有属性callee和caller。利用arguments.callee可以获取函数本身的引用,利用arguments.callee可以获取调用当前函数的父函数对象。
另外,arguments.length是实际参数的长度,arguments.callee.length则是形参的长度,如函数fun_a(arg1,arg2)的调用fun_a(1) ,arguments.length为1,而arguments.callee.length则是2。除了用来验证参数之外,arguments.callee还常常用来打印其本身和递归计算。
/** 演示函数的callee属性.* 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数*/
function calleeDemo() {alert(arguments.callee);
}
<span style="font-size:14px;"></span><pre name="code" class="html">calleeDemo();
/*function calleeDemo() {
alert(arguments.callee);
}*/
/** 演示函数的caller属性.* 说明:(当前函数).caller:返回一个对函数的引用,该函数调用了当前函数*/function callerDemo() {
<pre name="code" class="html"> alert(arguments.callee.caller);
}
function handleCaller() {callerDemo();
}
<span style="font-size:14px;"></span><pre name="code" class="html"><pre name="code" class="html">handleCaller();
/*function handleCaller() { callerDemo();}*/
2.call/apply(调用另一对象参数)
Javascript函数有两个非常重要的方法:apply、call,两者本质相同,区别仅在于调用参数形式的不同,call方法使用逗号隔开的参数列表,而apply方法通过数组形式传入参数。
<pre name="code" class="html">/** 演示函数的call与apply方法.*/var changed={boy:"LiLei",girl:"lucy"};var original={boy:"Jack",girl:"lily",ask:function(arg1,arg2){return this.boy+" and "+this.girl+"\nArguments: \n"+arg1+"\n"+arg2;}};alert("Original:"+original.ask());
/*
Original:Jack and lily
Arguments:
undefined
undefined
*/alert("call: "+original.ask.call(changed,"boy","girl"));
/*
call: LiLei and lucy
Arguments:
boy
girl
*/
alert("apply: "+original.ask.apply(changed,["boy","girl"]));
/*
call: LiLei and lucy
Arguments:
boy
girl
*/
<p>
</p>
这篇关于快速区分callee、caller、apply、call、arguments的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!