// 函数指向改变
function f1(x,y){
console.log((x+y)+":===>"+this);return"这是函数的返回值";}//apply和call调用
var r1=f1.apply(null,[1,2]);//此时f1中的this是window
console.log(r1);
var r2=f1.call(null,1,2);//此时f1中的this是window
console.log(r2);
console.log("=============>");//改变this的指向
var obj={
sex:"男"};//本来f1函数是window对象的,但是传入obj之后,f1函数此时就是obj对象的
var r3=f1.apply(obj,[1,2]);//此时f1中的this是obj
console.log(r3);
var r4=f1.call(obj,1,2);//此时f1中的this是obj
console.log(r4);
//方法指向改变
function Person(age){this.age = age;}
Person.prototype.sayHi = function (x, y){
console.log((x + y)+":====>"+this.age);//是实例对象};
function Student(age){this.age = age;}
var per =newPerson(10);//实例对象
var stu =newStudent(100);//实例对象//sayHi方法是per实例对象的
per.sayHi.apply(stu,[10,20]);//30:====>100
per.sayHi.call(stu,10,20);//30:====>100
per.sayHi(10,20);//30:====>10
调用的方式不同
apply和call方法是在调用的时候改变this的指向
bind方法是在复制的时候改变this的指向
bind方法是将函数复制一份返回,参数可以在复制的时候传进去,也可以在复制之后调用的时候传进去
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><script>
function f1(x, y){
console.log((x + y)+":=====>"+this.age);}
var ff=f1.bind(null);ff(12,23);
function Person(age){this.age=age;}
Person.prototype.play=function (){
console.log(this+"========>"+this.age);};
function Student(age){this.age=age;}
var per=newPerson(20);
var stu=newPerson(18);//复制了一份
var fy=per.play.bind(per);fy();//20</script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><script>
function MathRandom(){}
MathRandom.prototype.random=function (){
console.log(parseInt(Math.random()*10+1));};
MathRandom.prototype.show=function (){// window.setInterval(function () {// this.random();// }.bind(this),1000);setInterval(this.random.bind(this),1000)};
var show=newMathRandom();
show.show();</script></body></html>