此文内容不深,就当一个简单的笔记或总结吧。

  先从arguments对象说起吧,[fnName.]arguments (其中fnName可选),为当前执行的 function 对象返回一个arguments 对象。

  它有几个特性:

  1.arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。

  2.arguments 对象只有函数开始时才可用。

  3.arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。

  4.还有就是arguments对象存储的是实际传递给函数的参数,而非函数声明所定义的参数列表

  5.不能显式创建 arguments 对象。

下面就3,4两点举两个简单的例子:

function testArg(a,b){alert(arguments.length);//实际参数个数 alert(testArg.length); //声明参数个数arguments.length != 0&&alert(arguments[0]); //可以通过类似Array的方式访问arguments内部元素
}

您可以尝试运行下面的测试:
testArg()
当我们传一个参数时: testArg(true)

正因为上面的原因,所以我们说它是类似于Array的对象,但是它确实又不是Array对象。

//arguments类似Array,但又不是Array
Array.prototype.self = "me!"
alert((new Array()).self); //me!
(function(){alert(arguments.self); //undefined
})();

同样,也可以用instanceof来判断:

(function(){alert(arguments instanceof Object); //true alert(arguments instanceof Array); //false
})()

  下面说说caller,它是用于返回对一个函数的“引用”,表明函数调用了该函数,它有以下几个特性:

  1.caller 属性只有在函数执行时才有定义。

  2.如果函数是由顶层调用的,那么 caller 包含的就是 null 。

  3.如果在函数上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

/* == caller ==*/
function testCaller(){ //fnName.callerif(testCaller.caller){alert(testCaller.caller);}else {alert('top function')}
}

在函数上下文中调用看看:(function(){testCaller()})()

可以看到,结果为调用testCaller()的函数,也就是外层匿名函数的反编译文本。

恩,下面接着说arguments的另一个属性callee,(貌似叙述顺序有点乱,不好意思),说callee之前,咱们还是先说说匿名函数。

function fn1(){alert('one')}
var fn1 = function(){alert('one')}

这两种方式有什么区别?

1 第一种方式定义函数,函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。

2 第二种方式通过匿名函数创建,这种方式函数只能按照程序流程执行到定义的那一行代码才被声明,所以只能在定义之后调用它。

大家也看到了,上面举的几个小例子里就用了匿名函数。

现在问题出来了,我们知道,函数是可以递归调用的,比如我们做个高斯很小就会的题目:1+2+3+...+99+100?

这个问题就可以用递归做:

function sum(n){return n>0?n+sum(n-1):n;
}
alert(sum(100));

大家可以看下结果是不是当前高斯算出来的5050. run

那如果是匿名函数的递归调用呢?这是就需要刚刚提到的callee属性了。回到callee上来

callee 属性的初始值就是正被执行的 Function 对象,它返回的是当前正在执行的函数正文。

callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性。

下面就借助callee用匿名函数改写上面的简单例子:

(function(n){return n>0?n+arguments.callee(n-1):n
})(100);

这种方式是不是要优雅的多,而且比起直接用函数名作递归调用,这种方式更好的体现了是在调用自身。

恩,此文差不多就到这儿吧...

转载于:https://www.cnblogs.com/hongru/archive/2010/10/08/1845720.html

关于arguments,caller以及匿名函数调用的问题相关推荐

  1. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  2. python 递归函数_Python教程系列之递归函数与匿名函数调用

    Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数调用进行 ...

  3. python中fac函数是什么意思_好程序员Python教程系列之递归函数与匿名函数调用

    原标题:好程序员Python教程系列之递归函数与匿名函数调用 好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python ...

  4. javascript下的arguments,caller,callee,call,apply示例及理解

    在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义.在提到上述的概念之 前,首先想说说javascript中函数的隐含参数:arguments Argument ...

  5. python匿名函数调用_(Python) 函数、匿名函数

    本节将学习如何用Python定义函数,调用函数,以及学习匿名函数的使用 1.定义函数 Python中定义函数用关键字def,如下例所示,testFun为函数名 def testFun(): print ...

  6. apply call this arguments caller callee

    JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另 外一个对象上去运行,两者仅在定义参数的方式有所区别: Function.prototype.apply ...

  7. python匿名函数调用_python3笔记十六:python匿名函数和高阶函数

    一:学习内容 lambda函数 map函数与reduce函数 filter函数 sorted函数 二:匿名函数-lambda 1.概念:不使用def这样的语句去定义函数,使用lambda来创建匿名函数 ...

  8. python匿名函数调用_python之内置函数,匿名函数

    内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...

  9. html 匿名函数调用,浅析Javascript匿名函数与自执行函数

    函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 function doubl ...

最新文章

  1. OpenStack Swift源码安装
  2. aix系统服务器限制ftp访问,AIX 限制ftp用户只能访问其主目录
  3. 文件转换shape格式_万能格式转换器!支持200+种文件格式的云转换!
  4. Visual studio内存泄露检查工具--BoundsChecker
  5. python计算累计收益率的函数,在Python中计算累积密度函数的导数
  6. linux网卡主备,linux网卡bounding的主备模式下上层路由端需要什么设置?
  7. 游戏接腾讯平台的一些锁事
  8. 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件
  9. 实现财务自由 之 不可不知的常用财务网站或应用软件
  10. Java将 PDF 拆分为多个 PDF 文件
  11. 关于我使用校园网电脑被限速成10M宽带的悲惨教训
  12. 微服务来了,监控怎么办?
  13. 适用场景:All kinds of GCs
  14. AnimationDrawable 帧动画 爆炸特效
  15. 鲜为人知的Linux命令续
  16. VELO3D将推出1米高的大型工业3D金属打印机,Knust-Godwin成为首家客户
  17. ext4数据恢复实战及文件系统结构详解
  18. 利用鸿蒙系统硬件实现音乐播放功能之优秀
  19. pc端的企业网站(IT修真院test8)详解1-1
  20. 计算机毕业设计JAVA宠物咖啡馆平台系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. vim-python j教程_实践Vim配置python开发环境
  2. 三星 android 截屏,三星S7怎么截屏 3种三星S7截图方法
  3. php 同步退出,Ucenter 的同步登录与同步退出
  4. python循环一段代码_Python循环语句代码详解:while、for、break
  5. 笔试题:在整数数组中找到重复的数字
  6. mac下mysql忘记root密码的解决办法
  7. 生成二维码并以图片格式下载-qrcodejs2
  8. 聊聊Elasticsearch的Iterables
  9. Ansible 获取主机信息模块setup、获取文件详细信息模块stat(学习笔记十)
  10. 20155229 2016-2007-2 《Java程序设计》第一周学习总结