javascript中call,apply,callee,caller用法实例分析


Posted in Javascript onJuly 24, 2019

本文实例讲述了javascript中call,apply,callee,caller用法。分享给大家供大家参考,具体如下:

实践一:call,apply 用来让一个对象去调用本不属于自己的方法,两者都可以传递参数,call的参数是列表形式,apply的参数是数组形式

var person = {
 "name":"Tom",
 "say":function(){
 console.log("person say");
 },
 "count":function(x,y,z){
 console.log('x= ' + x + ', y= ' + y + ', z= ' + z);
 },
 "sayName":function(){
 console.log(this.name);
 }
}
// 下面的示例是数组 arr 去调用person的say方法 , 这里call用来让数组调用本不属于它自己的方法
var arr = [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对象

var program = {"name":"AlphaGo"}
person.sayName.call(program); // AlphaGo
person.sayName.apply(program); // AlphaGo

实践三:call,apply把伪数组转换为数组

// call,apply 把伪数组转换为数组
var wArr = {0:"hello",1:"world","length":2};
var arr1 = Array.prototype.slice.call(wArr);
var arr2 = Array.prototype.slice.apply(wArr);
console.log(arr1); // [hello,world]
console.log(arr2); // [hello,world]

这里找到一篇详细的  关于伪数组的文章

实践四:单纯的arguments对象

// 有关arguments
function count(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 用于查看,函数本身被哪个函数调用

function fn1(){
 if(fn1.caller){
 console.log(fn1.caller.name + " 是函数fn1的调用者");
 }else{
 console.log("直接执行");
 }
}
function fn2(){
 fn1();
};
fn2(); // fn2是是函数fn1的调用者

实践六:callee 返回正被执行的 Function 对象,常用于匿名函数的递归与arguments一起配合使用。

var sum = function(n){
 if(n>0) {
 return n + arguments.callee(n-1);
 }
 return 0;
};
var total = sum(10);
console.log(total); // 55
// arguments.callee 代指函数自身。
function test(){
 console.log(arguments.callee);
}
test(); // 输出函数自身的字符串表达式

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Expandable "Detail" Table Rows
Aug 29 Javascript
语义化 H1 标签
Jan 14 Javascript
extJs 下拉框联动实现代码
Apr 09 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
js图片处理示例代码
May 12 Javascript
原生js轮播(仿慕课网)
Feb 15 Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 Javascript
mint-ui在vue中的使用示例
Apr 05 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 jQuery
用Vue写一个分页器的示例代码
Apr 22 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
Sep 03 Javascript
javascript实现简单搜索功能
Mar 26 Javascript
javascript关于“时间”的一次探索
Jul 24 #Javascript
javascript面向对象三大特征之封装实例详解
Jul 24 #Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 #Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
Jul 24 #Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 #Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 #Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 #Javascript
You might like
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python自动格式化json文件的方法
2015/03/11 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
Python3的socket使用方法详解
2020/02/18 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
2014年秋季开学寄语
2014/08/02 职场文书
关于教师节的广播稿
2014/09/10 职场文书
幼儿园感谢信
2015/01/21 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android