JavaScript中callee和caller的区别与用法实例分析
作者:Yeoman92 发布时间:2024-04-10 13:59:35
本文实例讲述了JavaScript中callee和caller的区别与用法。分享给大家供大家参考,具体如下:
1.callee
在函数的内部,有两个特殊的对象:arguments和this。其中arguments是一个类似数组的对象,包含着传入函数的所有参数。
虽然arguments的主要用途是保存函数参数,但这个对象有一个属性——callee,该属性是一个指针,指向拥有这个arguments对象的函数
所以callee的作用就是来指向当前对象
看一个阶层函数的例子就会明白他的用途了:
/*
* 普通的递归阶层函数
*/
function factorial(num){
if(num <= 1){
return 1;
}else{
return num *factorial(num-1);
}
}
上面的代码运行没有问题,但这个函数的执行与函数名factorial紧紧耦合在一起了,要是改变了函数名,里面的函数名也要随着改变,这样很不方便,所以我们用arguments.callee
来消除这种耦合。
//使用callee属性的递归阶层函数
function factorial1(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
根据callee的定义,callee是arguments对象的一个属性,指向拥有arguments对象的函数,这个函数就是factorial1 (factorial1=arguments.callee),他们指向的都是上面的递归函数。请记住函数的名字仅仅是一个包含指针的变量而已。
2.caller
caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
返回一个对函数的引用,该函数调用了当前函数。
function a(){//父函数
b();
};
function b(){
console.info(b.caller);
};
a(); //结果就是弹出函数a和内容
可以看到函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a)
3.将callee和caller结合起来使用
function b(){
alert(b.caller);
};
从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便,我们需要替换里面的那个b
前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:
(function a(){
b();
})();
function b(){
alert(arguments.callee.caller);//用arguments.callee代替了b
};
4.实例:斐波那契数列(用递归思想)
如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)
var result=[];
function fn(n){
if(n==1){
return 1;
}else if(n==2){
return 1;
}else {
if(result[n]){
return result[n];
}else{
//arguments.callee(...)=fn(...)
result[n]=arguments.callee(n-1)+arguments.callee(n-2);
return result[n];
}
}
}
希望本文所述对大家JavaScript程序设计有所帮助。
来源:https://blog.csdn.net/Yeoman92/article/details/54926343
猜你喜欢
- 一、数据预处理实验数据来自genki4k提取含有完整人脸的图片def init_file(): num = 0&n
- 本文实例总结了PHP中非常有用却鲜有人知的函数。分享给大家供大家参考,具体如下:PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函
- 方法一:(by yangedie )这几天刚刚做了这个东西,有网友问到,所以分享一下。ie6、firefox2 通过,麻烦有ie7的网友测试
- 前言本文主要给大家介绍了关于Django快速分页的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。分页在web开发
- 整个安装流程如下: 1,首先安装apache:我安装的版本是: httpd-2.2.16-win32-x86-openssl-0.9.8o.
- 介绍我们可以通过控制HeaderStyle, RowStyle, AlternatingRowStyle和其他一些属性来改变GridView
- 适用环境: PHP5.2.x / mysql 5.0.xclass Mysql { priva
- 函数执行流程def foo1(b,b1=3): print("foo1 called",b,b1)def
- 目标跟踪是对摄像头视频中的移动目标进行定位的过程,有着非常广泛的应用。实时目标跟踪是许多计算机视觉应用的重要任务,如监控、基于感知的用户界面
- 一、安装Pyinstaller环境:python3.6、window10注意事项:python64位版本打包的exe,只能在64位操作系统使
- 慢SQL与索引的关系慢SQL优化原则数据库也是应用,MySQL 作为一种磁盘数据库,属于典型的 IO 密集型应用,并且随机 IO 比顺序 I
- python使用super()出现错误解决办法当我们在python的子类中调用父类的方法时,会用到super(),不过我遇到了一个问题,顺便
- 概述在使用Typora写比较长的文章时,需要给章节编号,方便区分层次。如果手动编号,一旦章节顺序改变,很多章节的编号都需要一一手动修改,极其
- 简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了。去
- 在多线程中使用lock可以让多个线程在共享资源的时候不会“乱”,例如,创建多个线程,每个线程都往空列
- 写了一个抓taobao图片的爬虫,全是用if,for,while写的,比较简陋,入门作品。从网页http://mm.taobao.com/j
- 写在前面SciPy的optimize模块提供了许多数值优化算法,下面对其中的一些记录。非线性方程组求解SciPy中对非线性方程组求解是fsl
- 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下:像函数一样,Python中的类方法也是一种对象。由于既可以
- 本文实例讲述了Python模块相关知识点。分享给大家供大家参考,具体如下:1.模块:定义:用来从逻辑上组织python代码(变量,函数,类,
- 以下代码已经在SQLServer2008上的示例数据库测试通过问题一:如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,