共同点

三个办法都是用来从新定义this指向的,第一个参数都是this要指向的对象

不同点

a、call函数能够有多个参数
b、apply函数的第二个函数是数组,数组的每一项都是指标函数的参数
c、bind函数返回的是一个函数,应用时须要调用触发
d、bind函数的底层是call实现的

应用办法

call的用法:
例如判断数据类型,个别用Object.prototype.toString联合call办法来进行判断:

var obj = {}console.log(Object.prototype.toString.call(obj) === "[object Object]");

为什么须要应用call函数来判断?而不是间接应用obj.toString()呢?
因为obj对象可能重写toString办法

apply的用法:
栗子1: 例如咱们在应用Math函数获取最大最小值时能够这样应用Math.max(5,6,7,8,9),这样能获取到最大值9,然而如何去求一个数组中的最大值呢?

//这样应用是行不通的var arr = [5,6,7,8,9]Math.max(arr)//只能这样应用Math.max.apply(null, arr)

栗子2: 两个数组 var arr1 = [1,2,3]; var arr2 = [2,3,4],如何优雅的将arr2中的值追加到arr1中去呢?
这里能够应用apply函数,能够这样写:
Array.prototype.push.apply(arr1, arr2)

bind用法:

this.num = 9; var mymodule = {  num: 81,  getNum: function() { return this.num; }};mymodule.getNum(); // 打印进去是 81var getNum = mymodule.getNum;getNum() // 这里打印进去是9,因为this指向windowvar bindNumber = mymodule.getNum.bind(mymodule)bindNumber() // 这里打印进去的是81,利用bind将this指向了mymodule对象