简单来说其实这三个函数基本上都是同一个功能
都是用来重定义 this 这个对象的
先看明白下面这两个例子
例1:
var name = '张三',age = 17; var obj = { name:'李四', objAge:this.age, myFun:function(){ console.log('姓名:' + this.name + ', 年龄:' + this.age); } } console.log(obj.objAge);//输出结果:17 obj.myFun();//输出结果:姓名:李四, 年龄:undefined
例2:
var book = '三体'; function showBook(){ console.log(this.book); } showBook();//输出结果:三体
比较一下这两个例子中 this
的差别,例1
打印里面的 this
指向 obj
,例2
全局声明的 showBook()
函数中的 this
指向 window
代码示例:
var name = '张三',age = 17; var obj = { name:'李四', objAge:this.age, myFun:function(){ console.log('姓名:' + this.name + ', 年龄:' + this.age); } } var kk = { name:'王五', age:55 } obj.myFun.call(kk); //输出结果:姓名:王五, 年龄:55 obj.myFun.apply(kk); //输出结果:姓名:王五, 年龄:55 obj.myFun.bind(kk)(); //输出结果:姓名:王五, 年龄:55
以上除了 bind
方法后面多了个 ()
外 ,输出结果完全一致
由此得出结论: bind
返回的是一个新的函数,你必须调用它才会被执行。
代码示例:
var name = '张三',age = 17; var obj = { name:'李四', objAge:this.age, myFun:function(hight,weight){ console.log('姓名:' + this.name + ', 年龄:' + this.age + ', 身高:' + hight + ', 体重:' + weight); } } var kk = { name:'王五', age:55 } obj.myFun.call(kk,183,90); //输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90 obj.myFun.apply(kk,[183,90]); //输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90 obj.myFun.bind(kk,183,90)(); //输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90 obj.myFun.bind(kk,[183,90])(); //输出结果:姓名:王五, 年龄:55, 身高:183,90, 体重:undefined
只有微妙的差距
从上面四个结果不难看出:
call(),apply(),bind() 这三个函数的第一个参数都是 this
的指向对象,第二个参数差别就来了:
call() 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(kk,’特长’, … ,’string’ )。
apply() 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(kk,[‘爱好’, …, ‘string’ ])。
bind() 除了返回是函数以外,它的参数和 call() 一样。
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等