探究call、apply、bind以及它们的区别

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容