JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象
JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域。这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢)。因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问。
调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments
函数的实际参数:实际参数对象
arguments对象,用来引用实际参数对象。函数的arguments对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。索引 n 实际上是arguments对象的 0…n 属性的其中一个参数。
(function f(){//求和函数
var i,sum=0;
for(i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
})(1, 2, 3);//输出: 6
需要说明的是:JavaScript函数并不会检查参数的类型和数量
arguments属性callee(JavaScript 1.2新属性)
实际参数对象的callee属性引用了当前正在执行的函数。这在未命名的 函数递归调用 自身时非常有用
(function(x){//求x的阶乘
if(typeof x == "number" && x >0){
return x * arguments.callee(x-1);
}
return 1;//当x等于0时输出1
})(5);//输出: 120
arguments属性caller
实际参数对象的caller属性引用的是当前函数被调用的调用环境(说白了就是返回一个函数(F)的引用,该函数(F)调用了当前函数)。
注意:arguments.caller引用的不是调用当前函数的那个函数,而是调用当前函数的函数的实际参数对象。所以要引用调用函数,必须使用functionName.caller.callee
但是在JavaScript的实际实现中, 它直接引用了调用函数,而不是调用函数的实际参数对象。
(function(){
function inner(){
return inner.caller
}
return inner();
})();
/*输出:
function(){
function inner(){
return inner.caller
}
return inner();
}
//根据大家的说法,这个输出的是原函数的反编译的文本
//这个caller并不是在定义时就确定的上下文环境,而是在实际调用中动态生成的。
function inner(){
return f.caller;
}
(function (){
return inner();
})();
//输出:function (){
// return inner();
// }
*/
//需要说明的是:如果当前函数是顶层函数, functionName.caller返回的是null
疑惑:这个caller的实际用途到底是什么???还希望有实际案例的朋友可以留言告诉我
(看到网上的说法:caller的应用场景 主要用于察看函数本身被哪个函数调用。但是本人还是没有想到,什么养的情况下需要查看自身被那个函数调用了,不过在《JavaScript权威指南》里给出了一个例子,应用caller属性来编写一个调试函数,用来输出一个栈的踪迹[追踪栈的函数])
获取函数名称的方法
//针对function xxx(){}定义函数方法
var reg = /function *(\w*)\(\w*\)/;
function test(){};
var funName = test.toString().match(reg);
if(funName){
console.log(funName[1]);//输出: test
}
//针对var xxx = function(){}定义方式
var test = function(){};
var funName = test.toString().match(reg);
if(funName && funName[1] == ""){
console.log("该函数是匿名函数");
}
JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法的更多相关文章
- Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归
Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...
- JS函数的参数对象arguments在严格模式下的限制
在JS中,传入的函数的参数个数可以与定义函数的个数不一致,那么对于传入的实参的引用,则是arguments对象.然而改对象在严格模式和非严格模式下是由区分的: 1 在严格模式下arguments作为了 ...
- 传递给函数的隐含参数:arguments及递归函数的实现
传递给函数的隐含参数:arguments当进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments.arguments是一个类似数组但不是数组的对象,说它类似是因为它具有数组一样的 ...
- 函数中的this与argument对象,以及argument中的callee与caller属性
相关阅读:https://segmentfault.com/a/1190000015438195 相关阅读: https://zhuanlan.zhihu.com/p/23804247 相关阅读: h ...
- arguments.callee 和 caller
arguments arguments它是一个类数组对象,包含着传入函数中的所有参数.虽然 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组)
php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组) 一.总结 牛客网和洛谷一样,是真的好用 二.php重建二叉树 输入某二 ...
- callee和caller属性的区别
在函数内部,有两个特殊的对象:arguments和this .arguments是一个类数组对象,用于存放传入函数中的所有参数. callee是arguments对象的属性,caller是所有函数对象 ...
- JavaScript函数中的参数(arguments)
arguments argument是JavaScript中的一个关键字,用于指向调用者传入的所有参数. function example(x){ alert(x); alert(arguments. ...
随机推荐
- 201521123063 《Java程序设计》 第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boole ...
- 201521123078 《Java程序设计》第6周学习总结
1. 本周学习总结 2. 书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 1.子类要实现Clone ...
- 201521123072《java程序设计》第四次总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.11.2 使用常规方法总结其他上课内容 一些小的方法归纳: 通过 instanceof 可以判断父类引用所引用的对象实例的实际类 ...
- 201521123007《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1有关继承的知识点: 1.2有关多态 多态性:相同的形态,不同的行为.体现在相同的方法名 ...
- 201521123056 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1 instanceof 测试一个对象是否是某个类的实例,即使左边是右边类的子类的实例对 ...
- 201521123039 《java程序设计》第一周学习总结(新)
1.本章学习总结 -Java是面向对象的程序语言,它一切定义都是对象.我们所编写的Java程序经过编译后生成了.class的文件,再经过JVM对.class解释运行就可以得到Java程序,所以Java ...
- 解决"应用程序无法启动,因为应用程序的并行配置不正确"问题
想必不少人都会遇到题目中的问题.我在一次和舍友一起重装系统的时候变遇到了上述的问题, 经过仔细分析发现电脑会出现上述问题所必要的条件 系统中没有存在合理的运行库文件 所运行的软件是之前重装系统之间留下 ...
- Markdown 模板
一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...
- linux crontab详解
服务的启动和停止 cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond ...
- xml是什么,为什么要用xml
XML概念 众所周知,xml常用语数据存储和传输,文件后缀为 .xml: 它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言. 标记,指计算机所能理 ...