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 相关文章推荐
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
Mar 24 Javascript
js删除所有的cookie的代码
Nov 25 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
JS案例分享之金额小写转大写
May 15 Javascript
jquery比较简洁的软键盘特效实现方法
Mar 19 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
详解vue 实例方法和数据
Oct 23 Javascript
极简主义法编写JavaScript类
Nov 02 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
一个分页的论坛
2006/10/09 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
10款实用的PHP开源工具
2015/10/23 PHP
JSONP 跨域共享信息
2012/08/16 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Python3实现购物车功能
2018/04/18 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
Python列表list排列组合操作示例
2018/12/18 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
怎样自定义一个异常类
2016/09/27 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
保安岗位职责
2014/02/21 职场文书
师德师风剖析材料
2014/09/30 职场文书
售房协议书范本
2015/08/11 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
Golang map映射的用法
2022/04/22 Golang
Django框架中视图的用法
2022/06/10 Python