关于前端:callapply和bind的用法和区别

55次阅读

共计 1305 个字符,预计需要花费 4 分钟才能阅读完成。


首先来看三个办法的根本语法:

1.call 办法

作用 : 是调用函数,专门用于批改办法外部的 this 指向, 指定 this 能够代表谁
例如 fn.call(obj)
意思就是 调用函数 fn,并且 this 指向 obj 对象

call 的应用语法:
函数名字.call(对象, 参数 1, 参数 2,...);
实例: 
function test(a,b){console.log(this);
      console.log(a + b);
  }
  test(1,2);  //  window  3
  var obj = {name:'zjy'};
  window.test.call(obj,3,5);  //  {name:'zjy'} 8

解析:没有应用 call 办法时,test 办法的 this 指向全局对象 window,而当应用了 call 办法后,将 test 的 this 指向从 window 变成了 obj 对象,而前面的参数则是对应办法的形参程序


2. apply 办法

作用: 和 call 办法一样也是批改办法外部的 this 指向的,它们的区别在于 apply 的第二个参数必须为一个数组(部署了 Iterator 接口的类数组对象也能够)

// ?apply 的应用语法
// 函数名字.apply(对象,[参数 1, 参数 2,...]);
实例: 
    function test(a,b){console.log(this);
        console.log(a + b);
    }
    test(1,2);  //  window  3
    var obj = {name:'zjy'};
    window.test.apply(obj,[3,5]);  //  {name:'zjy'} 8

解析:没有应用 apply 办法时,test 办法的 this 指向全局对象 window,而当应用了 apply 办法后,将 test 的 this 指向从 window 变成了 obj 对象,而前面的数组参数则是将数组中元素顺次对应到 test 办法形参的地位


3. bind 办法

作用:扭转 this 的指向问题, 是绑定函数的 this,同时返回绑定后的新函数
例如
var fb = fn.bind(obj);
window.fb();
无论谁调用 fb 函数, 函数的 this 都会指向 obj

// ?bind 的应用语法
// 函数名字.bind(对象, 参数 1, 参数 2,...);
实例:
  var obj = {key:"value"}
    var foo = function(){console.log(this)
    }
    foo.bind(obj)()  //  obj

解析: 解析:在没有应用 bind 办法时,foo()中的 this 指向的是全局对象 window, 而应用了 bind 办法之后则指向的是 obj 对象

作用:前两个都是为了扭转 this 指向,bind 是扭转 this 指向并且复制这个办法返回

总结

apply,call,bind 三者的区别 :

1. 三者都能够扭转函数的 this 对象指向。

2. 三者第一个参数都是 this 要指向的对象,如果如果没有这个参数或参数为 undefined 或 null,则默认指向全局 window。

3. 三者都能够传参,然而 apply 是数组,而 call 是参数列表,且 apply 和 call 是一次性传入参数,而 bind 能够分为屡次传入。

4. bind 是返回绑定 this 之后的函数,便于稍后调用;apply、call 则是立刻执行。

粗体

正文完
 0