首页 > 编程知识 正文

apply bind(javascript call)

时间:2023-05-06 04:44:07 阅读:102125 作者:3637

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的类出现之前,需要它们来实现继承关系。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。