js函数的调用者和所有者

时间:2022-10-01 19:04:21

转载自:http://lee3836.iteye.com/blog/438979

函数的调用者指的是函数被调用的域(可以理解函数本身),Function 对象的caller属性是对当前函数的函数的引用。如果该函数是从JavaScript程序的顶层调用的,caller的值为null。函数的所有者指的是调用这个函数的对象。 

看例子: 
Java代码  js函数的调用者和所有者
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.  <BODY>  
  5.   <SCRIPT LANGUAGE="JavaScript">  
  6.   <!--  
  7.     function dwn(s)  
  8.     {  
  9.         document.write(s+'<br/>');  
  10.     }  
  11.   
  12.     //定义一个Point类型  
  13.     function Point(x,y)  
  14.     {  
  15.         this.x = x ;   
  16.         this.y = y ;  
  17.     }  
  18.   
  19.     //定义一个Vector类型  
  20.     function Vector(x,y)  
  21.     {  
  22.         this.x = x ;  
  23.         this.y = y ;  
  24.     }  
  25.   
  26.     function f()  
  27.     {  
  28.         dwn(this.constructor);  
  29.     }  
  30.   
  31.     var p = new Point(1,3);  
  32.     p.f=f;//把f()当做p的方法来用  
  33.     p.f();//调用时,f中的this指向p,因此this.constructor得到p的构造函数Point  
  34.       
  35.     var v = new Vector(11,22);  
  36.     v.f=f;//把f()当做v的方法来用  
  37.     v.f();//调用时,f中的this指向v,因此this.constructor得到v的构造函数Vector  
  38.   //-->  
  39.   </SCRIPT>  
  40.  </BODY>  
  41. </HTML>  


下面说一下动态调用所有者 
ECMAScript v3给function原型定义了两个方法:call和apply,使用这两个方法可以像调用其他对象方法一样调用函数。call()和apply()方法的第一个参数都是要调用函数的对象用call和apply调用函数是,函数内的this属性总是引用这个参数。call()的声誉参数是传递给要调用函数的值,数量可以是任意的.apply()只不过它只接受两个参数,第一个是调用对象,第二个参数是一个带下标的集合。 
看例子: 
Java代码  js函数的调用者和所有者
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.  </HEAD>  
  5.   
  6.  <BODY>  
  7.   <SCRIPT LANGUAGE="JavaScript">  
  8.   <!--  
  9.     function dwn(s)  
  10.     {  
  11.         document.write(s+"<br/>");  
  12.     }  
  13.   
  14.     //定义一个Point类型  
  15.     function Point(x,y)  
  16.     {  
  17.         this.x = x ;   
  18.         this.y = y ;  
  19.         this.toString = function(){  
  20.             return "("+[x,y]+")";  
  21.         }  
  22.     }  
  23.   
  24.     //定义一个Vector类型  
  25.     function Vector(x,y)  
  26.     {  
  27.         this.x = x ;  
  28.         this.y = y ;  
  29.         this.toString = function(){  
  30.             return "("+[x,y]+")";  
  31.         }  
  32.     }  
  33.   
  34.     //这个函数将传入的参数累加到独享的x,y属性上  
  35.     function add(x,y)  
  36.     {  
  37.         return new this.constructor(this.x+x,this.y+y)  
  38.     }  
  39.   
  40.     var p = new Point(1,2);  
  41.     var v = new Vector(-1,2);  
  42.     var p1 = add.call(p,3,4);//把add函数作为p的方法调用  
  43.     var v1 =add.apply(v,[3,4]);//把add函数作为v的方法调用  
  44.     dwn(p1);  
  45.     dwn(v1);  
  46.   //-->  
  47.   </SCRIPT>  
  48.  </BODY>  
  49. </HTML>