JavaScript中的callee,caller,call,apply的使用
网上看到一个简单易懂的教程,贴出来分享。
1 <script language="JavaScript"> 2 /* 3 * 演示arguments的用法,如何获取实参数和形数数 4 */ 5 function argTest(a,b,c,d){ 6 var numargs = arguments.length; // 获取被传递参数的数值。 7 var expargs = argTest.length; // 获取期望参数的数值。 8 alert("实参数目为:"+numargs) 9 alert("形数数目为:"+expargs) 10 11 alert(arguments[0]) 12 alert(argTest[0]) //undefined 没有这种用法 13 } 14 //argTest(1,2) 15 //argTest(1,2,3,4,5) 16 17 /* 18 * arguments不是数组(Array类) 19 */ 20 21 Array.prototype.selfvalue = 1; 22 function testAguments(){ 23 alert("arguments.selfvalue="+arguments.selfvalue); 24 } 25 //alert("Array.sefvalue="+new Array().selfvalue); 26 //testAguments(); 27 28 29 30 31 32 /* 33 * 演示函数的caller属性. 34 * 说明:(当前函数).caller:返回一个对函数的引用,该函数调用了当前函数 35 */ 36 37 function callerDemo() { 38 if (callerDemo.caller) { 39 var a= callerDemo.caller.arguments[0]; 40 alert(a); 41 } else { 42 alert("this is a top function"); 43 } 44 } 45 function handleCaller() { 46 callerDemo(); 47 } 48 49 //callerDemo(); 50 //handleCaller("参数1","参数2"); 51 52 53 /* 54 * 演示函数的callee属性. 55 * 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数 56 */ 57 function calleeDemo() { 58 alert(arguments.callee); 59 } 60 //calleeDemo(); 61 //(function(arg0,arg1){alert("形数数目为:"+arguments.callee.length)})(); 62 63 64 /* 65 * 演示apply,call函数的用法 66 * 说明:作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别: 67 * apply(thisArg,argArray); 68 * call(thisArg[,arg1,arg2…] ]); 69 * 即所有函数内部的this指针都会被赋值为thisArg 70 */ 71 72 function ObjectA(){ 73 alert("执行ObjectA()"); 74 alert(arguments[0]); 75 this.hit=function(msg){alert(msg)} 76 this.info="我来自ObjectA" 77 } 78 79 function ObjectB(){ 80 alert("执行ObjectB()"); 81 //调用ObjectA()方法,同时ObjectA构造函数中的所有this就会被ObjectB中的this替代 82 ObjectA.apply(this,arguments);//ObjectA.call(this); 83 alert(this.info); 84 } 85 //ObjectB('参数0'); 86 87 88 var value="global 变量"; 89 function Obj(){ 90 this.value="对象!"; 91 } 92 function Fun1(){ 93 alert(this.value); 94 } 95 //Fun1(); 96 //Fun1.apply(window); 97 //Fun1.apply(new Obj()); 98 </script>