首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

js中callee与caller的区别

建站高手 2015-4-27 [建站] 来自PC 复制链接
21309
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数
首先我们来写个阶成函数:
  1. function chen(x){
  2. if (x<=1) {
  3. return 1;
  4. } else{
  5. return x*chen(x-1);
  6. };
  7. };
复制代码


从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试
  1. function chen(x){
  2. if (x<=1) {return 1;
  3. }else{
  4. return x*arguments.callee(x-1);
  5. };
  6. };
复制代码


我们来分析一下为什么这样写:根据callee的定义,可以看出来callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是chen(chen=arguments.callee),这样解释应该可以理解了吧。
注意:在严格模式下访问arguments.callee会出错。不过可以使用命名函数表达式的方式来编写:
  1. var chen=(function chen(x){
  2. if (x<=1) {return 1;
  3. }else{
  4. return x*chen(x-1);
  5. };
  6. });
复制代码


这样的写法,在严格模式和非严格模式都可以行得通。

caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
先来个例子吧
  1. function a(){
  2. b();
  3. };
  4. function b(){
  5. alert(b.caller);
  6. };
  7. a(); //结果就是弹出函数a和内容
复制代码



我们来解释一下吧,首先函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a),所以结果就是弹出 function a(){ b();};

那么了解了caller和callee,那么可以不可以将二者结合在一起来使用呢
  1. function b(){
  2. alert(b.caller);
  3. };
复制代码


从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便,我们需要替换里面的那个b
前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:

  1. (function a(){
  2. b();
  3. })();

  4. function b(){
  5. alert(arguments.callee.caller);
  6. };
复制代码

从代码中可以看出我们用arguments.callee代替了b函数,所以解决了一下麻烦。。。。。



上一篇:MySql中Where语句IN的排序方法详解
下一篇:解析提高PHP执行效率的50个技巧
ww456123 发表于 2015-5-2 16:16:07 来自PC
真是难得给力的帖子啊。
lelegoer 发表于 2015-5-21 16:50:07 来自PC
看到这帖子真是高兴!
miyukong.com yihaojiayuan,.com howdian.com
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表