js中的caller和callee属性介绍和例子


Posted in Javascript onJune 07, 2014

一、caller

返回一个对函数的引用,该函数调用了当前函数。

functionName.caller

functionName 对象是所执行函数的名称。

说明

对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。

下面的例子说明了 caller 属性的用法:

function callerDemo() {
    if ( arguments.caller) {
        var a= callerDemo.caller.toString();
        alert(a);
    } else {
        alert("this is a top function");
    }
}
function handleCaller() {
    callerDemo();
}
handleCaller();
function calleeDemo() {
     alert(arguments.callee);
}
calleeDemo();

二、callee

返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。

[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。

说明

callee 属性的初始值就是正被执行的 Function 对象。

callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。

示例

//callee可以打印其本身
function calleeDemo() {
     alert(arguments.callee);
}
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
    if (arguments.length==arguments.callee.length) {
         window.alert("验证形参和实参长度正确!");
        return;
     } else {
         alert("实参长度:" +arguments.length);
         alert("形参长度: " +arguments.callee.length);
     }
}
//递归计算
var sum = function(n){
  if (n < = 0)                       
  return 1;
  else
    return n +arguments.callee(n - 1)
}

比较一般的递归函数:
var sum = function(n){
    if (1==n) return 1;
else return n + sum (n-1);

调用时:alert(sum(100));

其中函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用
一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法。

Javascript 相关文章推荐
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
angularjs学习笔记之双向数据绑定
Sep 26 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
Jan 26 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
Jan 12 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
VueJs组件之父子通讯的方式
May 06 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 Javascript
js实现自动播放匀速轮播图
Feb 06 Javascript
vue.js this.$router.push获取不到params参数问题
Mar 03 Javascript
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 #Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 #Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 #Javascript
jQuery的缓存机制浅析
Jun 07 #Javascript
Firefox中使用outerHTML的2种解决方法
Jun 07 #Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
Jun 06 #Javascript
判断iframe里的页面是否加载完成
Jun 06 #Javascript
You might like
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php代码书写习惯优化小结
2013/06/20 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
Python函数中定义参数的四种方式
2014/11/30 Python
python 计算文件的md5值实例
2017/01/13 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python学生信息管理系统修改版
2018/03/13 Python
python如何读写csv数据
2018/03/21 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
房地产推广策划方案
2014/05/19 职场文书
党员公开承诺书内容
2014/05/20 职场文书
公司离职证明范本
2014/10/17 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android