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 相关文章推荐
关于图片验证码设计的思考
Jan 29 Javascript
常用Extjs工具:Extjs.util.Format使用方法
Mar 22 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
javascript中2个感叹号的用法实例详解
Sep 04 Javascript
利用原生JavaScript获取元素样式只是获取而已
Oct 08 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 Javascript
Element UI框架中巧用树选择器的实现
Dec 12 Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
PHP中常用数组处理方法实例分析
2008/08/30 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
php生成mysql的数据字典
2016/07/07 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
详解Django中的过滤器
2015/07/16 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
pycharm 安装JPype的教程
2019/08/08 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
pytorch SENet实现案例
2020/06/24 Python
专科应届生求职信
2013/11/24 职场文书
承办会议欢迎词
2014/01/17 职场文书
房屋委托书范本
2014/04/04 职场文书
出国留学计划书
2014/04/27 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
郭明义电影观后感
2015/06/08 职场文书
升学宴祝酒词
2015/08/11 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
Mysql Online DDL的使用详解
2021/05/20 MySQL
vue 实现上传组件
2021/05/31 Vue.js
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android