1.callee

  callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数

  作用:就是用来指向当前对象

  返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文. 
  callee是arguments 的一个属性成员,它表示对函数对象本身的引用,这有利于匿名 
  函数的递归或者保证函数的封装性。 下面一段代码先说明callee的用法,实例代码摘自网上 :

 function calleeLengthDemo(arg1, arg2) {
  alert(arguments.callee.toString());
  if (arguments.length == arguments.callee.length) {
    window.alert("验证形参和实参长度正确!");
    return;
6   } else {
    alert("实参长度:" + arguments.length);
    alert("形参长度: " + arguments.callee.length);
  }
}
calleeLengthDemo(1);

  第一个消息框弹出calleeLengthDemo函数本身,这说明callee就是函数本身对象的引用。

  callee还有个非常有用的应用就是用来判断实际参数跟行参是否一致。上面的代码第一个消息框会弹出实际参数的长度为1,形式参数也就是函数本身的参数长度为2.

2.caller

  caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)

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

  functionName.caller

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

  注意:

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

  看看下面的函数,

 function caller() {
  if (caller.caller) {
    alert(caller.caller.toString());
  } else {
5     alert("函数直接执行");
  }
}
function handleCaller() {
  caller();
}
handleCaller();
caller();

  大家会发现第一个alert会弹出调用caller函数的调用者handleCaller,而第二个alert由于没有在其他函数体内调用,所以caller为null,就执行了 alert("函数直接执行");

应用场景: 
  callee的应用场景一般用于匿名函数 
  大家看下下面一段代码 摘自网络

 var fn=function(n){
  if(n>0) return n+fn(n-1);
  return 0;
}
alert(fn(10))

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

 var fn=(function(n){
  if(n>0) return n+arguments.callee(n-1);
3   return 0;
})(10);
alert(fn)

  这样就让代码更加简练。又防止了全局变量的污染。

  caller的应用场景 主要用于察看函数本身被哪个函数调用。

JavaScript中的callee与caller的区别的更多相关文章

  1. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  2. javascript 中 arguments.callee属性

    javascript 中 arguments.callee属性 可以在函数内部,指向的是这个函数(或者叫做“类”)本身. 相当于PHP 中的 self 关键字. The arguments.calle ...

  3. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  4. JavaScript中=、==、===以及!=、!==的区别与联系

    JavaScript中=.==.===以及!=.!==的区别与联系   在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...

  5. JavaScript中object和Object有什么区别

    JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 ————————————————————— ...

  6. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  7. 关于javascript中apply()和call()方法的区别

    如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...

  8. javascript 中 offsetWidth,clientWidth;offsetHeight,clientHeight的区别

    javascript 中 offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变 clientWidth.offsetWidth.clientHeight区别IE6.0.FF ...

  9. 在 JavaScript 中 prototype 和 __proto__ 有什么区别

    本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的 ...

随机推荐

  1. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  2. 串口流控制详解(CTS/RTS,DTR/DSR)

    1 首先看下关于流控相关的几个端口的解释如下图 除了必要的地(GND)要连接外,其它连如下 步骤阅读 2 计算机和猫(MODEM)的连接 步骤阅读 步骤阅读 3 计算机和非猫的连接(null  mod ...

  3. 洛谷P3385负环

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  4. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)

    题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...

  5. Centos中查询目录中内容命名ls

    首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,  #代表用户权限   #表示超级用户,$表示普通用户: 查询目录中内容命令 ls  (list缩写) ...

  6. 使用 ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体

    使用 @ControllerAdvice & ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体 1.Controller代码 以下是Con ...

  7. 使用EasyWechat快速开发微信公众号支付

    前期准备: 申请微信支付后, 会收到2个参数, 商户id,和商户key.注意,这2个参数,不要和微信的参数混淆.微信参数: appid, appkey, token支付参数: merchant_id( ...

  8. Newtonsoft.Json 序列化器的重写

    public class TestConverter : JsonConverter { public override void WriteJson(JsonWriter writer, objec ...

  9. Kaldi 安装

    以后要重点搞caldi了,虽然集群上有,但还是本地安装一下吧. 参考   Kaldi 学习手记(一):Kaldi 的编译安装   在 ubuntu 下安装 kaldi 基本步骤 两个文章基本差不多 1 ...

  10. 关于C语言的几个考试编程题目

    提交要求:1:邮件名称:学号后三位-题目编号-姓名-期中考试.例如:098-1-沈苗-期中考试2:不用附件提交,直接写邮件,内容包括编程思路(写一段自己对题目的认识.思路.技术细节等).源代码.运行结 ...