javascript中call,apply,callee,caller用法实例分析
本文实例讲述了javascript中call,apply,callee,caller用法。分享给大家供大家参考,具体如下:
实践一:call,apply用来让一个对象去调用本不属于自己的方法,两者都可以传递参数,call的参数是列表形式,apply的参数是数组形式
varperson={ "name":"Tom", "say":function(){ console.log("personsay"); }, "count":function(x,y,z){ console.log('x='+x+',y='+y+',z='+z); }, "sayName":function(){ console.log(this.name); } } //下面的示例是数组arr去调用person的say方法,这里call用来让数组调用本不属于它自己的方法 vararr=[1,2]; person.say.call(arr); //call还可以传递参数 person.count.call(arr,1,2,3);//x=1,y=2,z=3 //apply还可以这样 person.count.apply(arr,[1,2,3]);//x=1,y=2,z=3
实践二:call,apply用来修改this, 同样引用上例的person对象
varprogram={"name":"AlphaGo"} person.sayName.call(program);//AlphaGo person.sayName.apply(program);//AlphaGo
实践三:call,apply把伪数组转换为数组
//call,apply把伪数组转换为数组 varwArr={0:"hello",1:"world","length":2}; vararr1=Array.prototype.slice.call(wArr); vararr2=Array.prototype.slice.apply(wArr); console.log(arr1);//[hello,world] console.log(arr2);//[hello,world]
这里找到一篇详细的 关于伪数组的文章
实践四:单纯的arguments对象
//有关arguments functioncount(a,b,c){ console.log(arguments.length); if(count.length===arguments.length){ console.log('实际参数与形参个数相同'); }else{ console.log('实际参数与形参个数不同'); } } count(1,2,3);//实际参数与形参个数相同 count(1,2);//实际参数与形参个数不同 /* 这里count.length表示形参个数 arguments.length表示实参个数 */
实践五:caller用于查看,函数本身被哪个函数调用
functionfn1(){ if(fn1.caller){ console.log(fn1.caller.name+"是函数fn1的调用者"); }else{ console.log("直接执行"); } } functionfn2(){ fn1(); }; fn2();//fn2是是函数fn1的调用者
实践六:callee返回正被执行的Function对象,常用于匿名函数的递归与arguments一起配合使用。
varsum=function(n){ if(n>0){ returnn+arguments.callee(n-1); } return0; }; vartotal=sum(10); console.log(total);//55 //arguments.callee代指函数自身。 functiontest(){ console.log(arguments.callee); } test();//输出函数自身的字符串表达式
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。