天天看点

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

在学习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的不同用法;

继续阅读