Javascript arguments.callee和caller的区别
一、callee
在学习callee之前,需要先学习arguments。
arguments:
- 含义:该对象代表正在执行的函数和调用它的函数的参数。
- 语法:
1
|
[ function .]arguments[n] |
参数:function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
- 说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
- callee:指向当前函数的引用
- length: 真正传递的参数的个数
- properties-indexes:就是函数的参数值(按参数列表从左到右排列)
而其中第一个就是今天需要学习的一个属性。先看一个例子:
1
2
3
4
5
|
function add(a,b){ console.log(arguments.callee); return a+b; } add(3,4); |
结果:
从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function fac(num){ if (num <= 1){ //0的阶乘也是1 return 1; } else { return num*fac(num-1); } } var trueFac = fac; fac = function (num){ return 0; }; console.log(trueFac(10)); |
结果:
结果并不是我们想要的,造成这个结果的原因就是在后边更改了fac,fac()永远返回0,而trueFac()方法中利用了fac()方法,造成了结果是0。解决这个问题就可以使用arguments.callee属性。
代码改为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function fac(num){ if (num <= 1){ //0的阶乘也是1 return 1; } else { return num*arguments.callee(num-1); } } var trueFac = fac; fac = function (num){ return 0; }; console.log(trueFac(10)); |
结果为:
arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。
二、caller
caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。
例子:
1
2
3
4
5
6
7
|
function outer(){ inner(); } function inner(){ console.log(inner.caller); } outer(); |
结果:
从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。
Javascript arguments.callee和caller的区别的更多相关文章
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- JavaScript中的callee与caller的区别
1.callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 作用:就是用来指向当前对象 返回正被执行的 Function 对象,也就是所指定的 Functi ...
- JavaScript中callee与caller,apply与call解析
1. arguments.callee 1.1 解释 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文. 1,.2 说明 callee 属性的初始值就是正被执行的 ...
- 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)
在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...
- js中的bind、apply、call、callee、caller的区别
1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...
- js中callee与caller的区别
callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数首先我们来写个阶成函数:function chen(x){if (x<=1) {return 1;} else ...
- arguments.callee 和 caller
arguments arguments它是一个类数组对象,包含着传入函数中的所有参数.虽然 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指 ...
- JavaScript Arguments.callee解释
Arguments.callee : 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.[function.]arguments.callee可选项 functio ...
- 关于arguments.callee.caller.arguments[0]获得event的一些问题
先从一个简单的例子说起,一个简单的button控件如下: < input type ='button' name ='mybtn' id ='mybtn' onclick ='myFun ...
随机推荐
- python3 json模块
import json '''把python对象转化为json串(字符串), ensure_ascii处理中文乱码'''dic = {"复联4": "好看吗", ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示
1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...
- 控制结构(10): 指令序列(opcode)
// 上一篇:管道(pipeline) // 下一篇:Continuation-passing_style(CPS) 发现问题 在一个正式项目的开发周期中,除了源代码版本控制外,还存在着项目的配置/编 ...
- SqlServer如何判断字段中是否含有汉字?
--/* --unicode编码范围: --汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) --数字:[0x30,0x39](或十进制[48, 57]) --小写字母:[0 ...
- 删除 node_modules文件夹cmd指令
方法一: npm install rimraf -g rimraf node_modules 方法二: rmdir /s/q your_app_dir 方法三: rm -f /node_modules
- 洛谷P3957 跳房子(Noip2017普及组 T4)
今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...
- 一键分享代码(提供能分享到QQ空间、新浪微博、人人网等的分享功能)
<html> <head></head> <body> <div class="xl_2"> <span styl ...
- Java基础-1
基础知识 1.进制 1.十进制 2.二进制 3.十六进制 2.十六进制转换 二进制转换 十进制转换
- Django+Vue打造购物网站(七)
个人中心功能开发 drf文档注释 http://www.django-rest-framework.org/topics/documenting-your-api/ 动态设置serializer和pe ...