关于javascript:javascript中applycall和bind的区别

37次阅读

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

JS 中,这三者都是用来扭转函数的 this 对象的指向的,他们有什么样的区别呢。
在说区别之前还是先总结一下三者的相似之处:
1、都是用来扭转函数的 this 对象的指向的。
2、第一个参数都是 this 要指向的对象。
3、都能够利用后续参数传参。
那么他们的区别在哪里的,先看一个例子。

const man = {
      name : "小王",
      gender : "男",
      age : 24,
      say : () => {console.log(this.name + "," + this.gender + ", 往年" + this.age);
               }
}
const woman = {
      name : "小红",
      gender : "女",
      age : 18
}
man.say();

自身没什么好说的,显示的必定是小王,男,往年 24。
那么如何用 mansay办法来显示 woman 的数据呢。

对于 call 能够这样:
man.say.call(woman);
对于 apply 能够这样:
man.say.apply(woman);
而对于 bind 来说须要这样:
man.say.bind(woman)();

如果间接写 man.say.bind(woman) 是不会有任何后果的,看到区别了吗?callapply 都是对函数的间接调用,而 bind 办法返回的依然是一个函数,因而前面还须要 () 来进行调用才能够。
那么 callapply有什么区别呢?咱们把例子略微改写一下。

const man = {
      name : "小王",
      gender : "男",
      age : 24,
      say : (like1, like2) => {console.log(this.name + "," + this.gender + ", 往年" + this.age + ", 喜爱" + like1 + "和" + like2);
               }
}
const woman = {
      name : "小红",
      gender : "女",
      age : 18
}

能够看到 say 办法多了两个参数,咱们通过 call/apply 的参数进行传参。
对于 call 来说是这样的

man.say.call(woman,"唱歌","跳舞");       

而对于 apply 来说是这样的

man.say.apply(woman,["唱歌","跳舞"]);

看到区别了吗,call前面的参数与 say 办法中是一一对应的,而 apply 的第二个参数是一个数组,数组中的元素是和 say 办法中一一对应的,这就是两者最大的区别。
那么 bind 怎么传参呢?它能够像 call 那样传参。

man.say.bind(woman,"唱歌","跳舞")();

然而因为 bind 返回的依然是一个函数,所以咱们还能够在调用的时候再进行传参。

man.say.bind(woman)("唱歌","跳舞");

正文完
 0