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 相关文章推荐
ToolTips JQEURY插件之简洁小提示框效果
Nov 19 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
Jun 06 Javascript
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 Javascript
js图片轮播插件的封装
Jul 21 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
jQuery实现右侧抽屉式在线客服功能
Dec 25 jQuery
简单的Vue异步组件实例Demo
Dec 27 Javascript
Angular4 反向代理Details实践
May 30 Javascript
vue实现按需加载组件及异步组件功能
May 27 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
JS继承 笔记
2011/07/13 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
jquery中radio checked问题
2015/03/16 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python中标准库OS的常用方法总结大全
2017/07/19 Python
Python中property函数用法实例分析
2018/06/04 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
Python列表对象实现原理详解
2019/07/01 Python
Python selenium的基本使用方法分析
2019/12/21 Python
学习python需要有编程基础吗
2020/06/02 Python
c++工程师面试问题
2013/08/04 面试题
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
高级文秘工作总结的自我评价
2013/09/28 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
工程承包协议书
2014/10/20 职场文书
工地食品安全责任书
2015/05/09 职场文书
Python实现归一化算法详情
2022/03/18 Python
Python 匹配文本并在其上一行追加文本
2022/05/11 Python