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 相关文章推荐
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
JavaScript中switch判断容易犯错的一个细节
Aug 27 Javascript
JavaScript异步加载浅析
Dec 28 Javascript
js采用concat和sort将N个数组拼接起来的方法
Jan 21 Javascript
hammer.js实现图片手势放大效果
Aug 29 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
javascript原型链学习记录之继承实现方式分析
May 01 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
JavaScript中作用域链的概念及用途讲解
Aug 06 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
php木马攻击防御之道
2008/03/24 PHP
php下通过POST还是GET来传值
2008/06/05 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
JavaScript加强之自定义event事件
2013/09/21 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python 修改本地网络配置的方法
2019/08/14 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
python压包的概念及实例详解
2021/02/17 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
安全生产计划书
2014/05/04 职场文书
机动车交通事故协议书
2015/01/29 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js