函数在调用时实际上通过call来调用的
即  function test(){ }
test();  —->  test.call();
call/apply的作用是改变this的指向  指向的是我传进去的参数
如果传的是null  就不改变
例一
function Person(age){
this.age = age;
}
var person = new Person(20);
var obj = { }
Person.call(obj,50)
//本来obj对象中没有任何属性
//但是Person.call改变了this的指向  此时Person中的this指代的是obj
//即  obj.age = age;  所以此时obj中就有了age属性  值为50
例二
应用:
function Person(name,age){
this.name = name;
this.age = age;
}
function Student(name,age,grade){
Person.call(this,name,age);
this.grade = grade;
}
var student = new Student(‘haha’,20,2020);
//可以理解为Student对象构造方法在函数体的最前面加一个 var this = { }
//然后这个this传递给了Person  然后执行完Person的构造方法后
//this就变为  this = { name : ‘haha’,20 }
//最后执行this.grade = grade;  即  this = { name : ‘haha’,20,2020 }
call/apply的**区别**
后面传的参数形式不同  即传参列表不同
call  需要把实参按照形参的个数传进去
Person.call(this,name,age);
apply  需要传一个数组(即arrguments)
如  Person.apply( this,[name,age] );
