xxx是个函数,调用xxx有三个方法 调用者.xxx(参数列表) xxx.call(调用者,参数列表) xxx.apply(调用者,arguments);
xxx(p1,p2,p3)
=xxx.call(调用者,p1,p2,p3)
xxx(p1,p2,p3)
=xxx.call(调用者,p1,p2,p3)
=xxx.apply(调用者,arguments)
ps:函数总有调用者,默认是window
<html>
<head></head>
<body>
<script type="text/javascript">
/*将函数当成类来使用时,函数里面的参数可分为三种
1、类变量: 以类名为前缀 (JS不允许用实例调用类变量)
2、实例变量 以this为前缀
3、局部变量 没有前缀的变量
*/
alert("下面开始方法当类使用");
//function定义的既是一个函数也是一个类,也是构造器
function Person(name ,age){
this.name=name;
this.age=age;
//Person类的类变量
Person.eyeNum=2;
//函数是独立存在的,哪怕定义在函数里面
this.info=function(){
alert("我的信息是"+this.name+"->"+this.age);
};
}
alert(Person.eyeNum);//undefined 类变量需要在该类初始话后才能
var p=new Person("孙悟空",500);
alert(Person.eyeNum);
alert(p.eyeNum);//undefined JS不允许用实例调用类变量
p.info();
//alert(p.info);
alert("下面开始方法不同调用");
function Dog(name,age){
this.name=name;
this.age=age;
}
var dog=new Dog("旺财",4);
/*
call 是一个特殊用法
xxx是个函数,调用xxx有三个方法 调用者.xxx(参数列表) xxx.call(调用者,参数列表) xxx.apply(调用者,arguments);
xxx(p1,p2,p3)
=xxx.call(p1,p2,p3)
=xxx.apply(调用者,arguments)
*/
p.info.call(dog);//dog引用p.info()方法
var a=4;//
function test(){
var a=3;
alert("简单的函数,a的值是"+this.a);
//若加了this.a只搜索主调对象是否含有a,如果不存在,则undefined
//a首先看方法体里面有没有a,如果没有则在主调对象里面搜索,看是否存在a,
//如果没有,一级一级往上找,直到找到或者到达window对象
}
alert("函数总有调用者,默认是window");
/*
函数总有调用者,默认是window
*/
test();
window.test();
var o=new Object();
test.call(o);
var myfun=function(a,b){
alert("a的值是"+a);
alert("b的值是"+b);
this.test=a+b;
};
myfun(12,6);
alert(window.test);//18
var object =new Object();
myfun.call(object,13,3);
alert(object.test);//16
alert(window.test);//18
var fuc=function(a,b){
myfun.apply(object,arguments);
};
fuc(2,3);
alert(object.test);//5
</script>
</body>
</html>