函数的作用域:调用对象

  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. 201521123114 《Java程序设计》第6周学习总结

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

  2. 201521123008《Java程序设计》第二周实验总结

    本周学习总结 ① 数据类型,其中char是占用两个字节的内存空间,其他和以前学过的一样.除了十进制位,整型也可以用八进制或者十六进制表示.浮点型不精确. ②运算符,算术,赋值,逻辑,位运算. ③str ...

  3. 纯CSS写正方形自适应宽高,且左侧高与正方形高保持一致

    先上图 虽然写法有点暴力,但是效果还是可以的,哈哈哈哈哈html:<div class="box">            <div class="le ...

  4. <c:forEach>+<c:if>

    <c:forEach>:用来做循环<c:if>:相当于if语句用于判断执行,如果表达式的值为 true 则执行其主体内容. <c:forEach var="每个 ...

  5. Node.js 异步异闻录

    本文首发在个人博客:http://muyunyun.cn/posts/7b9fdc87/ 提到 Node.js, 我们脑海就会浮现异步.非阻塞.单线程等关键词,进一步我们还会想到 buffer.模块机 ...

  6. 【实验吧】Reverse400

    在网上下载,pyinstxtractor.py,对Reverse400.exe进行反汇编 得到其源代码为 $ cat Revesre03 data = \ "\x1c\x7a\x16\x77 ...

  7. JavaScript中的ASCII碼轉換成字符的兩種方法

    方法一:轉義字符 \xxx:用十六進制的ASCII碼值轉換成字符. 方法二:String方法 String.fromCharCode(value): //用十進制的ASCII碼值轉換成字符. 舉例:結 ...

  8. appium 原理解析

    Appium是 c/s模式的appium是基于 webdriver 协议添加对移动设备自化api扩展而成的webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 p ...

  9. 原型模式和基于原型继承的js对象系统

    像同样基于原型编程的Io语言一样,javascript在原型继承方面,实现原理和Io非常类似,javascript也遵守这些原则 所有数据都是对象 要得到一个对象,不是通过实例化类,而是找到一个对象作 ...

  10. window10简单安装MongoDB

    文章参考 在Windows上安装MongoDB 首先,在官网下载安装包.下载地址 内容如下所示: 配置 1. 创建数据目录 E:\MongoDB\data\db 2. 配置环境变量 运行 1. 命令行 ...