js函式的呼叫者和所有者
阿新 • • 發佈:2019-02-04
函式的呼叫者指的是函式被呼叫的域(可以理解函式本身),Function 物件的caller屬性是對當前函式的函式的引用。如果該函式是從JavaScript程式的頂層呼叫的,caller的值為null。函式的所有者指的是呼叫這個函式的物件。
看例子:
Java程式碼
下面說一下動態呼叫所有者
ECMAScript v3給function原型定義了兩個方法:call和apply,使用這兩個方法可以像呼叫其他物件方法一樣呼叫函式。call()和apply()方法的第一個引數都是要呼叫函式的物件用call和apply呼叫函式是,函式內的this屬性總是引用這個引數。call()的聲譽引數是傳遞給要呼叫函式的值,數量可以是任意的.apply()只不過它只接受兩個引數,第一個是呼叫物件,第二個引數是一個帶下標的集合。
看例子:
Java程式碼
看例子:
Java程式碼
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <BODY>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- function dwn(s)
- {
- document.write(s+'<br/>');
- }
- //定義一個Point型別
-
function Point(x,y)
- {
- this.x = x ;
- this.y = y ;
- }
- //定義一個Vector型別
- function Vector(x,y)
- {
- this.x = x ;
- this.y = y ;
- }
- function f()
- {
- dwn(this.constructor);
- }
- var p = new Point(1,3);
- p.f=f;//把f()當做p的方法來用
-
p.f();//呼叫時,f中的this指向p,因此this.constructor得到p的建構函式Point
- var v = new Vector(11,22);
- v.f=f;//把f()當做v的方法來用
- v.f();//呼叫時,f中的this指向v,因此this.constructor得到v的建構函式Vector
- //-->
- </SCRIPT>
- </BODY>
- </HTML>
下面說一下動態呼叫所有者
ECMAScript v3給function原型定義了兩個方法:call和apply,使用這兩個方法可以像呼叫其他物件方法一樣呼叫函式。call()和apply()方法的第一個引數都是要呼叫函式的物件用call和apply呼叫函式是,函式內的this屬性總是引用這個引數。call()的聲譽引數是傳遞給要呼叫函式的值,數量可以是任意的.apply()只不過它只接受兩個引數,第一個是呼叫物件,第二個引數是一個帶下標的集合。
看例子:
Java程式碼
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- </HEAD>
- <BODY>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- function dwn(s)
- {
- document.write(s+"<br/>");
- }
- //定義一個Point型別
- function Point(x,y)
- {
- this.x = x ;
- this.y = y ;
- this.toString = function(){
- return "("+[x,y]+")";
- }
- }
- //定義一個Vector型別
- function Vector(x,y)
- {
- this.x = x ;
- this.y = y ;
- this.toString = function(){
- return "("+[x,y]+")";
- }
- }
- //這個函式將傳入的引數累加到獨享的x,y屬性上
- function add(x,y)
- {
- return new this.constructor(this.x+x,this.y+y)
- }
- var p = new Point(1,2);
- var v = new Vector(-1,2);
- var p1 = add.call(p,3,4);//把add函式作為p的方法呼叫
- var v1 =add.apply(v,[3,4]);//把add函式作為v的方法呼叫
- dwn(p1);
- dwn(v1);
- //-->
- </SCRIPT>
- </BODY>
- </HTML>