call()和apply()的第一个参数是调用函数的母对象,它是改变上下文(环境),改变this指针,也就是说this的值绑定到o对象上(默认情况下this是绑定到window上)或者说o对象赋值给this;
例如 fn1.call(o); fn1.apply(o), o这个对象原先是不存在fn1方法的,想要以对象O的方法来调用fn1函数。
call和apply没有多大区别,call参数是单个参数传入,apply的第二个参数是以数组形式传入,数组是包括了类数组对象(带有length的对象)和真实数组,就是说这种方式去调用的时候,参数是会当做实参参入到fn1中去;
bind() 主要作用是将函数绑定至某个对象
function f(y){
return this.x+y;
}
var o = {x: 1};
var g = f.bind(o); //给o对象添加一个f的引用 这里的g就是新函数,调用这个g()就相当于o.f();
g(2) //=>3
function bind(f, o){
if (f.bind) return f.bind(o);//存在bind方法,则给o对象添加一个f的引用
else return function(){
return f.apply(o, arguments);
}
}
var sum = function(x,y) {return x+y};
var succ = sum.bind(null, 1); // 绑定this的值为null, x的值为1
succ(2)// y的值为2 , => 3
function f(y,z){
return this.x + y + z;
}
var g = f.bind({x: 1}, 2); //绑定this的值为{x:1}, y的值为2,//注意这一步仅仅是新函数,还没有去调用
g(3)// z的值为3, =>6