00-1010在js中,每个函数的原型都指向Function.prototype对象(基于原型链的js继承)。因此,每个函数都有从函数继承的应用、调用和绑定方法。它们的功能是一样的,它们都是用来在函数中改变这个方向的。
介绍
apply的用法可以表示为:A.apply(B,[x,y,z]);这个方法可以改变函数A的这个方向指向函数b,第二个参数是函数参数表的数组形式。调用的用法与apply类似,只是传递参数的方式不同。与此类似,A.apply(B,x,y,z)可以单独发送多个参数,而不是将所有参数放入一个数组中,然后像apply一样发送。
Bind传递参数的方式与调用相同,只是apply和call方法将在调用后立即执行,而bind方法将在调用后返回一个新函数,该函数不会立即执行,需要手动执行。
使用方法
var name='匿名';var年龄=20岁;
//global.name
//global.age
var p1={
名称: 'kfdbq ',
12岁:
func:函数(){ 0
console . log(` name : $ { this . name },age :${this.age} `)
}
}
var p2={
名称: 'hsjdlq ',
15岁
}
P1 . func();//姓名:kfdbq,年龄:12
P1 . func . call();//姓名:匿名,年龄:20
P1 . func . apply(p2);//姓名:hsjdlq,年龄:15
P1 . func . bind(p2)();//name:hsjdlq,age:15直接调用p1.func方法时,这是指当前的p1对象,所以name和age都是自身对象的属性值。当使用call方法时,当传入的第一个参数为空时,在浏览器环境中,这指向window;在节点环境中,这指向全局。读者可以将姓名和年龄改为global.name和global.age进行验证。使用apply方法时,传入p2相当于将函数的这个指向p2对象。因此,此时打印的属性都是p2对象的属性。使用bind方法时,会生成一个新的函数对象,所以需要手动执行这个函数(也就是在函数末尾加一个括号)。00-1010的例子结束后,调用、应用和绑定的区别就清楚了。它们的存在只是为了改变这一背景。所以,有时候你会看到这样的用法。为了不改变这个方向,bind(this)通常被添加在函数之后,如下所示
Function () {}。bind (this)在这种情况下,就不会有莫名其妙的这个指向问题了。当我明明想在函数中调用这个函数所属对象的一个属性,为什么不能用这个来访问?(写js的新手肯定会遇到这个问题)
事实上,从es6开始,就支持箭头功能。我建议你用箭头函数,这样就不会有这个指向的问题了。
另外,使用call和apply也可以实现函数的继承。在es6的类出现之前,需要它们来实现继承关系。