call、apply和bind都是用于改变方法中this指向的。
var x = "window_x";
var obj = {
x : "obj_x",
fn : function(y){
console.log(this.x + " ; " + y);
}
}
obj.fn(1); //obj_x ; 1
var fn = obj.fn;
fn(1); //window_x ; 1
fn.call(obj,1); //obj_x ; 1
fn.apply(obj,[1]); //obj_x ; 1
fn.bind(obj,1); //返回fn方法:f (y){console.log(this.x + " ; " + y);}
var bfn = fn.bind(obj);
bfn(1); //obj_x ; 1
执行结果:
call调用 将方法中的this指向call中第一个参数,当第一个参数为null、undefined时,默认指向window; call中第一个参数之后是要传递给方法的参数列表。
apply与call相似,不同之处在于传递给方法的参数形式不一致。apply传递给方法的参数是数组的形式。
call和apply在改变方法的this指向时,会同时执行方法;而bind不会执行方法,而是返回改变this指向后的新方法。