函数的作用域:调用对象

  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("该函数是匿名函数");
}

转载于:https://www.cnblogs.com/caoruiy/p/4435916.html

JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...相关推荐

  1. js函数的内部属性---arguments,callee,caller

    在接下来的几篇文章中,我大家谈谈函数的内部属性,arguments,callee,caller (1)arguments,是一个类数组对象,其中包含了传入函数的所有参数,主要用途是,保存函数的参数: ...

  2. arguments.callee和caller的区别

    arguments.callee和caller的区别 1.arguments arguments 是一个对应于传递给函数的参数的类数组对象. 白话就是这是一个函数的传参的集合,不是数组,但是是一个类数 ...

  3. 事件参数对象下的几个属性 mouseenter与mouseover的区别

    事件参数对象下的几个属性 <!DOCTYPE html> <html lang="en"> <head><meta charset=&qu ...

  4. JS:函数的内置对象:arguments

    我们可以通过一个案列来理解什么是内置对象,arguments是什么,有什么作用,我们为什么要学 <!DOCTYPE html> <html lang="en"&g ...

  5. JavaScript文档对象模型document对象改变Html元素样式属性(5)

    1. document对象改变Html元素样式属性 行内样式操作案例如下: <!DOCTYPE html> <html><head><meta charset ...

  6. JavaScript文档对象模型document对象改变Html表单属性(4)

    1.document对象改变Html表单属性 更改Html元素内容时候可以用innerHtml属性进行修改,但是表单元素只能用value属性修改元素内容 案例如下: <!DOCTYPE html ...

  7. callee、caller、call、apply、bind这些方法的含义和使用

    在学校时间比较充裕,所以利用这段时间好好回顾下了js的基础.这回说下这五个函数属性方法,它们分别是:callee.caller.call.apply.bind 这5个方法在刚学js的时候一直理解不透, ...

  8. linux编译器 如何处理函数,在linux系统中,编译c程序,如何调用fmod函数

    1. 编译指示指令 C和C++的每个实现对它的主机或操作系统都支持一些独有的特征.例如,某些程序须对存放数据的存储器区域进行精确的控制,或必须控制特定函数接受参量的方式.#pragma指令对每个编译器 ...

  9. 23.C++类对象的指针为空时,调用成员函数不会挂掉

    最近工作的时候遇到了一个现象,当通过C++类对象的空指针调用没有使用this指针的成员函数时,不会出现段错误 测试代码 #include <iostream>using namespace ...

最新文章

  1. 如何仿写thinkphp的C方法?
  2. XamarinAndroid组件教程RecylerView动画组件使用动画(2)
  3. 【正一专栏】恒大中超七连冠到手了
  4. python中模块(Module)和包(Package)的区别 (导入模块、导入包)(import导包)
  5. 笔记-项目合同管理-项目合同谈判与签订-供应商项目立项
  6. 坐标轨迹计算_机器人的轨迹规划与自动导引
  7. 【Flink】flink zookeeper HA 实现分析
  8. java面试之闭包(closure)
  9. Animation中的scale、rotate、translate、alpha
  10. c++如何实现对硬盘的操作_Python 小技巧:如何实现操作系统兼容性打包?
  11. java 数组或者链表输出
  12. java实例化的4种方式
  13. python学习之迭代器
  14. 从魅力品质到伟大产品-卡诺模型
  15. 进程ld-linux-x86-64是什么,解决挖矿病毒占用cpu以及误删 ld-linux-x86-64.so.2 文件的问题...
  16. R语言 如何生成彩色柱状图
  17. 移动端车牌识别可以识别新能源汽车
  18. VMware16 安装Mac 10.14系统/苹果系统
  19. PYNQ2之ZYNQ的PS读写DDR
  20. 2023年电气,电子与信息工程国际会议(ISEEIE-2023)

热门文章

  1. sqlserver 查询一个表的所有字段代码
  2. Android TextView跑马灯效果与设置文字阴影
  3. Bootstrap--导航栏样式编辑
  4. 00018_流程控制语句switch
  5. 12-sed命令详解
  6. CCF 201612-2 工资计算 java 解题
  7. Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc
  8. android中实现“再按一次退出”功能
  9. 寒江的网站基本优化观点
  10. 超级菜菜鸟全程架站攻略(Mysql+Apche+PHP+Phpmyadmin+Zend,含本机安装)