通过实例理解JavaScript中的arguments,call,apply,callee及caller

本文详细介绍了JavaScript中的arguments、call、apply、caller及callee等函数特性的使用方法,并通过实例演示了如何利用这些特性进行递归计算、实现继承等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习javascript的过程中,会经常遇到arguments,callee等的使用。对于arguments的理解还是比较容易的,但是对于callee,caller,call和apply的概念自己还比较模糊,所以通过网络去搜索相关知识资料,那么最近看过一些解释文章,虽然结果都差不多,千篇一律的,但还是有很多收获的!(^_^这念头,有网络就是好;)

下面通过一些简单的实例来帮助自己理解:

arguments的用法:如何获取实参和形参(这个比较容易理解)

function Test(a,b,c,d){
var args = arguments.length;     // 获取实参
var expargs = Test.length;       // 获取形参

alert(“实参数目:”+args);           //5
alert(“形参数目:”+expargs);     //4

alert(arguments[0]);   //1
alert(Test[0]);          //输出undefined,因为没有这种用法;
}

执行:
Test(1,2,3,4,5);

上面的实例解释了arguments的用法及用处,同时有些情况下可以利用实参来作为判断条件使用;

这里要提到一点:arguments不是Array(数组)类;

通过实例证明:

Array.prototype.example = 1;
function test(){
alert(“value=”+arguments.example);
}
alert(“Array.value=”+new Array().example);   //Array.value=1;
test();   //value=undefined

Call及Apply的用法:

obj1.method1.call(obj2,argument1,argument2)
如上,call的作用就是把obj1的方法放到obj2上使用,后面的 argument1..这些做为参数传入

举一个具体的例子
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}

add.call(sub,3,1);

这个例子中的意思就是用add方法替换sub方法,add.call(sub,3,1) == add(3,1) ,所以运行结果为:4; // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

更有趣的,可以用 call 来实现继承

function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}

function Class2()
{
Class1.call(this);
}

var c2 = new Class2();

c2.showTxt(“cc”);

这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中就有Class1 的所有属性和方法了,c2 对象就能够直接调用Class1 的方法以及属性了,执行结果就是:alert(“cc”);

是的,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。

function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}

function Class11()
{
this.showAdd = function(a,b)
{
alert(a+b);
}
}

function Class2()
{
Class10.call(this);
Class11.call(this);
}

很简单,使用两个 call 就实现多重继承了!

那么关于Apply的用法其实和Call的用法基本差不多的,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组;

Callee属性的用法:

callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性;

该属性仅当相关函数正在执行时才可用

还有需要注意的是callee拥有length属性,这个属性有时用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是
形参长度,由此可以判断调用时形参长度是否和实参长度一致。(关于arguments的实参及形参长度在上面也已经详细介绍过)

看下具体的例子来帮助理解:

//递归计算

var sum = function(n){

if (n <= 0) {

return 1;

}
else{

return n +arguments.callee(n – 1)

}

}

Caller属性的解释:

说明:返回一个对函数的引用,该函数调用了当前函数。

functionName.caller : functionName 对象是所执行函数的名称。

注意:对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 JScript 程序的顶层调用的,那么 caller 包含的就是 null 。

如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

还是通过具体的实例来帮助理解:

function a(){document.write(a.caller+”<br>”)}
function b(){a()};
function c(){b()};
a();
b();
c();
输出结果为:
null
function b(){a()}
function b(){a()}

至此,通过几个实例来简单的讲解了arguments,call,apply,caller及callee的不同用法;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值