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