call,apply和bind都是Function原型中的方法。
作用就是就是改变this的指向。或者说 强行用其他对象来调用一个函数。除此之外还能在构造方法有中属性和函数的继承体现。
改变this指向的含义
function show(sex){
console.log("姓名为"+this.yourname+",性别为"+sex);
}
var person={
yourname:"张三",
age:14
};
show.call(person,"男");//姓名为张三,性别为男
show("男");//姓名为undefined,性别为男
在上面的代码块中,我们可以看到person对象并没有show方法,直接地用person.show()会报错。但是我们可以通过call方法来实现person对象来调用show方法。所以这种情况我认为就是改变了this的指向。
call和apply的使用方法相同。
call和apply的参数不同;
test.call ( this, param1 , param2 , param3 ) ; // 可以传多个参数
test.apply ( this, paramArray ) ; // 只能传两个参数,第二个一般为数组
call和apply会改变this指向,然后执行函数;
非严格模式下,如果参数不传,或者第一个参数是null/undefind,this都指向window。
严格模式下,第一个参数是谁,this就指向谁(包括null/undefind),不传this是undefind。
apply,传入的数组会以数组元素一个一个传入,而不是以整个数组传入。
bind会绑定this指向,然后作为一个新函数返回;
var person= {
yourname:"张三",
age:14,
greet: "Hello!",
greetUser: function(userName) {
console.log(this.greet + " " + userName);
}
};
var greetHola = person.greetUser.bind({greet: "Hola"});
var greetBonjour = person.greetUser.bind({greet: "Bonjour"},'Rahul');
greetHola("Rahul") // 输出"Hola Rahul"
greetBonjour() // 输出"Bonjour Rahul"