1. 程式人生 > >js函式的呼叫者和所有者

js函式的呼叫者和所有者

函式的呼叫者指的是函式被呼叫的域(可以理解函式本身),Function 物件的caller屬性是對當前函式的函式的引用。如果該函式是從JavaScript程式的頂層呼叫的,caller的值為null。函式的所有者指的是呼叫這個函式的物件。 
看例子: 
Java程式碼  收藏程式碼
  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.     //定義一個Point型別  
  12.     function Point(x,y)  
  13.     {  
  14.         this.x = x ;   
  15.         this.y = y ;  
  16.     }  
  17.     //定義一個Vector型別  
  18.     function Vector(x,y)  
  19.     {  
  20.         this.x = x ;  
  21.         this.y = y ;  
  22.     }  
  23.     function f()  
  24.     {  
  25.         dwn(this.constructor);  
  26.     }  
  27.     var p = new Point(1,3);  
  28.     p.f=f;//把f()當做p的方法來用  
  29.     p.f();//呼叫時,f中的this指向p,因此this.constructor得到p的建構函式Point
      
  30.     var v = new Vector(11,22);  
  31.     v.f=f;//把f()當做v的方法來用  
  32.     v.f();//呼叫時,f中的this指向v,因此this.constructor得到v的建構函式Vector  
  33.   //-->  
  34.   </SCRIPT>  
  35.  </BODY>  
  36. </HTML>  


下面說一下動態呼叫所有者 
ECMAScript v3給function原型定義了兩個方法:call和apply,使用這兩個方法可以像呼叫其他物件方法一樣呼叫函式。call()和apply()方法的第一個引數都是要呼叫函式的物件用call和apply呼叫函式是,函式內的this屬性總是引用這個引數。call()的聲譽引數是傳遞給要呼叫函式的值,數量可以是任意的.apply()只不過它只接受兩個引數,第一個是呼叫物件,第二個引數是一個帶下標的集合。 
看例子: 
Java程式碼  
收藏程式碼
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.  </HEAD>  
  5.  <BODY>  
  6.   <SCRIPT LANGUAGE="JavaScript">  
  7.   <!--  
  8.     function dwn(s)  
  9.     {  
  10.         document.write(s+"<br/>");  
  11.     }  
  12.     //定義一個Point型別  
  13.     function Point(x,y)  
  14.     {  
  15.         this.x = x ;   
  16.         this.y = y ;  
  17.         this.toString = function(){  
  18.             return "("+[x,y]+")";  
  19.         }  
  20.     }  
  21.     //定義一個Vector型別  
  22.     function Vector(x,y)  
  23.     {  
  24.         this.x = x ;  
  25.         this.y = y ;  
  26.         this.toString = function(){  
  27.             return "("+[x,y]+")";  
  28.         }  
  29.     }  
  30.     //這個函式將傳入的引數累加到獨享的x,y屬性上  
  31.     function add(x,y)  
  32.     {  
  33.         return new this.constructor(this.x+x,this.y+y)  
  34.     }  
  35.     var p = new Point(1,2);  
  36.     var v = new Vector(-1,2);  
  37.     var p1 = add.call(p,3,4);//把add函式作為p的方法呼叫  
  38.     var v1 =add.apply(v,[3,4]);//把add函式作為v的方法呼叫  
  39.     dwn(p1);  
  40.     dwn(v1);  
  41.   //-->  
  42.   </SCRIPT>  
  43.  </BODY>  
  44. </HTML>