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 相关文章推荐
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
jQuery随机切换图片的小例子
Apr 18 Javascript
Javascript改变CSS样式(局部和全局)
Dec 18 Javascript
canvas绘制的直线动画
Jan 23 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 Javascript
js实现小时钟效果
Mar 25 Javascript
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
php中session使用示例
2014/03/29 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python中property和setter装饰器用法
2019/12/19 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Python 实现简单的客户端认证
2020/07/29 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
先进集体事迹材料
2014/02/17 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
交通事故私了协议书
2014/04/16 职场文书
安全协议书范本
2014/04/21 职场文书
优秀教师个人材料
2014/12/15 职场文书
自我检讨报告
2015/01/28 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android