关于arguments,caller以及匿名函数调用的问题
此文内容不深,就当一个简单的笔记或总结吧。
先从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以及匿名函数调用的问题相关推荐
- vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...
- python 递归函数_Python教程系列之递归函数与匿名函数调用
Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数调用进行 ...
- python中fac函数是什么意思_好程序员Python教程系列之递归函数与匿名函数调用
原标题:好程序员Python教程系列之递归函数与匿名函数调用 好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python ...
- javascript下的arguments,caller,callee,call,apply示例及理解
在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义.在提到上述的概念之 前,首先想说说javascript中函数的隐含参数:arguments Argument ...
- python匿名函数调用_(Python) 函数、匿名函数
本节将学习如何用Python定义函数,调用函数,以及学习匿名函数的使用 1.定义函数 Python中定义函数用关键字def,如下例所示,testFun为函数名 def testFun(): print ...
- apply call this arguments caller callee
JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另 外一个对象上去运行,两者仅在定义参数的方式有所区别: Function.prototype.apply ...
- python匿名函数调用_python3笔记十六:python匿名函数和高阶函数
一:学习内容 lambda函数 map函数与reduce函数 filter函数 sorted函数 二:匿名函数-lambda 1.概念:不使用def这样的语句去定义函数,使用lambda来创建匿名函数 ...
- python匿名函数调用_python之内置函数,匿名函数
内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...
- html 匿名函数调用,浅析Javascript匿名函数与自执行函数
函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 function doubl ...
最新文章
- OpenStack Swift源码安装
- aix系统服务器限制ftp访问,AIX 限制ftp用户只能访问其主目录
- 文件转换shape格式_万能格式转换器!支持200+种文件格式的云转换!
- Visual studio内存泄露检查工具--BoundsChecker
- python计算累计收益率的函数,在Python中计算累积密度函数的导数
- linux网卡主备,linux网卡bounding的主备模式下上层路由端需要什么设置?
- 游戏接腾讯平台的一些锁事
- 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件
- 实现财务自由 之 不可不知的常用财务网站或应用软件
- Java将 PDF 拆分为多个 PDF 文件
- 关于我使用校园网电脑被限速成10M宽带的悲惨教训
- 微服务来了,监控怎么办?
- 适用场景:All kinds of GCs
- AnimationDrawable 帧动画 爆炸特效
- 鲜为人知的Linux命令续
- VELO3D将推出1米高的大型工业3D金属打印机,Knust-Godwin成为首家客户
- ext4数据恢复实战及文件系统结构详解
- 利用鸿蒙系统硬件实现音乐播放功能之优秀
- pc端的企业网站(IT修真院test8)详解1-1
- 计算机毕业设计JAVA宠物咖啡馆平台系统mybatis+源码+调试部署+系统+数据库+lw
热门文章
- vim-python j教程_实践Vim配置python开发环境
- 三星 android 截屏,三星S7怎么截屏 3种三星S7截图方法
- php 同步退出,Ucenter 的同步登录与同步退出
- python循环一段代码_Python循环语句代码详解:while、for、break
- 笔试题:在整数数组中找到重复的数字
- mac下mysql忘记root密码的解决办法
- 生成二维码并以图片格式下载-qrcodejs2
- 聊聊Elasticsearch的Iterables
- Ansible 获取主机信息模块setup、获取文件详细信息模块stat(学习笔记十)
- 20155229 2016-2007-2 《Java程序设计》第一周学习总结