你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
JavaScript中函数与对象的解析(五)
 

callee属性并不是arguments不同于数组对象的惟一特征,下面的代码说明了arguments不是由Array类型创建:  

Array.prototype.p1=1;  

alert(new Array().p1);  

function func(){  

       alert(arguments.p1);  

}  

func();

运行代码可以发现,第一个alert语句显示为1,即表示数组对象拥有属性p1,而func调用则显示为“undefined”,即p1不是arguments的属性,由此可见,arguments并不是一个数组对象。

6 函数的applycall方法和length属性   

JavaScript为函数对象定义了两个方法:applycall,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式上有所区别:

Function.prototype.apply(thisArg,argArray);  

Function.prototype.call(thisArg[,arg1[,arg2]]);   

从函数原型可以看到,第一个参数都被取名为thisArg,即所有函数内部的this指针都会被赋值为thisArg,这就实现了将函数作为另外一个对象运行的目的。两个方法除了thisArg参数,其余都是为Function对象传递的参数。下面的代码说明了applycall方法的工作方式:  

//定义一个函数func1,具有属性p和方法A 

function func1(){

      this.p="func1-";

      this.A=function(arg){

            alert(this.p+arg);  

      }

}

//定义一个函数func2,具有属性p和方法B 

function func2(){

      this.p="func2-";

      this.B=function(arg){

             alert(this.p+arg);

      }

}

var obj1=new func1();  

var obj2=new func2();  

obj1.A("byA");    //显示func1-byA 

obj2.B("byB");    //显示func2-byB 

obj1.A.apply(obj2,["byA"]); //显示func2-byA,其中[byA]是仅有一个元素的数组,下同 

obj2.B.apply(obj1,["byB"]); //显示func1-byB 

obj1.A.call(obj2,"byA");  //显示func2-byA 

obj2.B.call(obj1,"byB");  //显示func1-byB 

可以看出,obj1的方法A被绑定到obj2运行后,整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最后4行显示了applycall函数参数形式的区别。  

argumentslength属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。下面的代码将显示2

function sum(a,b){  

      return a+b;  

}  

alert(sum.length);

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089