函数的作用域:调用对象

  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属性 / 递归调用 / 获取函数名称的方法的更多相关文章

  1. Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归

    Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...

  2. JS函数的参数对象arguments在严格模式下的限制

    在JS中,传入的函数的参数个数可以与定义函数的个数不一致,那么对于传入的实参的引用,则是arguments对象.然而改对象在严格模式和非严格模式下是由区分的: 1 在严格模式下arguments作为了 ...

  3. 传递给函数的隐含参数:arguments及递归函数的实现

    传递给函数的隐含参数:arguments当进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments.arguments是一个类似数组但不是数组的对象,说它类似是因为它具有数组一样的 ...

  4. 函数中的this与argument对象,以及argument中的callee与caller属性

    相关阅读:https://segmentfault.com/a/1190000015438195 相关阅读: https://zhuanlan.zhihu.com/p/23804247 相关阅读: h ...

  5. arguments.callee 和 caller

    arguments arguments它是一个类数组对象,包含着传入函数中的所有参数.虽然 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指 ...

  6. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  7. php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组)

    php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组) 一.总结 牛客网和洛谷一样,是真的好用 二.php重建二叉树 输入某二 ...

  8. callee和caller属性的区别

    在函数内部,有两个特殊的对象:arguments和this .arguments是一个类数组对象,用于存放传入函数中的所有参数. callee是arguments对象的属性,caller是所有函数对象 ...

  9. JavaScript函数中的参数(arguments)

    arguments argument是JavaScript中的一个关键字,用于指向调用者传入的所有参数. function example(x){ alert(x); alert(arguments. ...

随机推荐

  1. 201521123015 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  2. 201521123085 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...

  3. 201521123097《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fin ...

  4. Junit4学习(四)Junit4常用注解

    一,背景知识: 由前面的知识可以知道: /*     * @Test:将一个普通方法修饰为一个测试方法     *   @Test(exception=XXX.class)     *   @Test ...

  5. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  6. 在有main函数的前提下 eclipse找不到主类

    有时候在测试类的时候eclipse会莫名奇妙的提示找不到主类   接下来分别有几种解决办法 1.在项目上右击> Builder Path -> Configure Build Path - ...

  7. 使用VMware Workstation Pro 12 虚拟机安装Mac OS系统教程 全程图解

    导读:使用虚拟机安装Windows.Linux或者Ubuntu系统大家或许看了很多,但如何使用VMware Workstation Pro 12安装Mac OS,的确需要好好研究一番:否则无法下手,因 ...

  8. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  9. js中的||与&&用法

    &&和||在JQuery源代码内尤为使用广泛,由网上找了些例子作为参考,对其用法研究了一下: &&: function a(){ alert("a" ...

  10. vue实例讲解之vuex的使用

    vuex是一个状态管理插件,本文通过一个简单的实例来讲解一下,vuex的使用. 先看一张官方的图: 这个图新手一看估计是蒙的,简单解释一下,这个图表示的就是vue通过Action Mutations ...