在js中,每一个函数的原型都指向Function.prototype对象(js基于原型链的继承)。所以,每一个函数都会有apply,call,和bind方法,这些方法继承于Function。
它们的做用是同样的,都是用来改变函数中this的指向。node
apply的用法能够表示以下:
A.apply(B, [x, y, z]);
此方法能够改变函数A的this指向,使之指向函数B。第二个参数传的是一个函数参数列表的数组形式。es6
call的用法和apply差很少,就只有传参方式不同。相似于这样 :
A.apply(B, x, y, z)
能够把多个参数分开来传,而不是像apply同样,须要把全部参数放到一个数组里边传进来。数组
bind的传参方式和call同样,只不过它的不一样之处是,apply和call方法调用以后会当即执行,而bind方法调用以后会返回一个新的函数,它并不会当即执行,须要咱们手动执行。浏览器
var name = "佚名"; var age = 20; //global.name //global.age var p1 = { name: "张三", age: 12, func: function(){ console.log(`姓名:${this.name},年龄:${this.age}`) } } var p2 = { name: "李四", age: 15 } p1.func(); //姓名:张三,年龄:12 p1.func.call(); //姓名:佚名,年龄:20 p1.func.apply(p2); //姓名:李四,年龄:15 p1.func.bind(p2)(); //姓名:李四,年龄:15
例子讲完,call,apply和bind的区别就已经很清楚了。它们就是为了改变this的上下文而存在。所以,有时候你会看到这样的用法。为了避免改变this的指向,一般会在函数后边加上bind(this),以下app
function f(){}.bind(this)
这样的话,就不会出现莫名其妙的this指向问题了。明明我想在函数里边调用此函数所属对象的某个属性时,为何用this却访问不到呢。(写js的新手确定会遇到过这种问题)函数
其实,从es6开始,已经支持箭头函数了,我建议你们用箭头函数,就不会出现this指向的问题了。this
另外,使用call,apply还能够实现函数的继承。在es6的class没有出现以前,就须要借助它们来实现继承关系。prototype