函数的调用者指的是函数被调用的域(可以理解函数本身),Function 对象的caller属性是对当前函数的函数的引用。如果该函数是从JavaScript程序的顶层调用的,caller的值为null。函数的所有者指的是调用这个函数的对象。
看例子:
下面说一下动态调用所有者
ECMAScript v3给function原型定义了两个方法:call和apply,使用这两个方法可以像调用其他对象方法一样调用函数。call()和apply()方法的第一个参数都是要调用函数的对象用call和apply调用函数是,函数内的this属性总是引用这个参数。call()的声誉参数是传递给要调用函数的值,数量可以是任意的.apply()只不过它只接受两个参数,第一个是调用对象,第二个参数是一个带下标的集合。
看例子:
看例子:
<!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>