Javascript arguments.callee和caller的区别

一、callee

  在学习callee之前,需要先学习arguments。

  arguments:

  • 含义:该对象代表正在执行的函数和调用它的函数的参数。
  • 语法:
[function.]arguments[n]

  参数:function :当前正在执行的 Function 对象的名字。

       n :要传递给 Function 对象的从0开始的参数值索引。   

  • 说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
  • Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
    1. callee:指向当前函数的引用
    2. length: 真正传递的参数的个数
    3. properties-indexes:就是函数的参数值(按参数列表从左到右排列)

  而其中第一个就是今天需要学习的一个属性。先看一个例子:

function add(a,b){
	console.log(arguments.callee);
	return a+b;
}
add(3,4);

  结果:

  

  从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。那么可以用这个属性可以做什么?再看一个例子:

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属性。

  代码改为:

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的早期版本不支持,这个属性保存着调用当前函数的函数的引用。

  例子:

function outer(){
	inner();
}
function inner(){
	console.log(inner.caller);
}
outer();

  结果:

 

  从结果可知,因为outer()调用了inner(),所以inner.caller就指向outer()。

  

时间: 2024-08-08 13:56:52

Javascript arguments.callee和caller的区别的相关文章

javascript中callee与caller的区别分析

callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 首先我们来写个阶成函数: function chen(x){ if (x<=1) { return 1; } else{ return x*chen(x-1); }; }; 从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试 function chen(x){ if (x<=1) {return 1; }else{ ret

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

在接下来的几篇文章中,我大家谈谈函数的内部属性,arguments,callee,caller (1)arguments,是一个类数组对象,其中包含了传入函数的所有参数,主要用途是,保存函数的参数: 代码1: function aa(b){alert(arguments);} aa(4); function aa(a,b,c,d){alert(arguments.length);} aa(1,2,3,4); function aa(a,b,c,d){alert(arguments[2]);} a

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

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并

js中的apply、call、callee、caller的区别

1.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于改变调用的函数中this的指向.如果不传对象或者传入的为null,那么默认对象就是window. 不同点:第2个参数,为调用的函数的参数,区别是apply要求所有函数的参数放在一个数组中传递. 使用方法: fun.call(thisArg[, arg1[, arg2[, …]]]) fun.apply(thi

js中callee与caller的区别

callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数首先我们来写个阶成函数:function chen(x){if (x<=1) {return 1;} else{return x*chen(x-1);};};从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试function chen(x){if (x<=1) {return 1;}else{return x*arguments.call

JavaScript Arguments.callee解释

Arguments.callee : 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.[function.]arguments.callee可选项 function 参数是当前正在执行的 Function 对象的名称.说明:callee 属性的初始值就是正被执行的 Function 对象.callee 属性是 arguments 对象的一个成员,他表示对函数对象本身的引用,这有利于匿名函数的递归或确保函数的封装性,例如下边示例的递归计算1到n的自然数之和.而

关于arguments.callee.caller.arguments[0]获得event的一些问题

先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFunc()' /> 然后为其注册事件,这样的情况,怎么在javascript里获取event呢,特别是firefox的情况.请看: < script  type ='text/javascript' > function  myFunc(){    var  ev  =  window.even

详解 arguments, callee, caller, call, apply的区别

1.一个完整的JavaScript应由三部分组成:核心(ECMAScript),文档对象模型(DOM),浏览器对象模型(BOM):2.ECMAScript中的参数在内部使用一个类数组来表示的,函数接收到的始终是这个类数组,在函数体内可以通过arguments对象来访问这个参数数组,arguments对象其实是一个类数组,不是Array的实例,香港虚拟主机,可以通过方括号语法来访问,同时也可以使用length方法: 关于arguments,它的值永远与对应命名参数的值保持同步,因为argument

JavaScript中的arguments,callee,caller

在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments: arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function:选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引.说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类似数组是