转载自:http://lee3836.iteye.com/blog/438979
函数的调用者指的是函数被调用的域(可以理解函数本身),Function 对象的caller属性是对当前函数的函数的引用。如果该函数是从JavaScript程序的顶层调用的,caller的值为null。函数的所有者指的是调用这个函数的对象。
看例子:- <!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()只不过它只接受两个参数,第一个是调用对象,第二个参数是一个带下标的集合。
看例子:
- <!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>