当前位置: 首页 > Web前端 > JavaScript

在JavaScript中将其更改为指向

时间:2023-03-27 15:40:20 JavaScript

我们之前说的就是代码中this的默认点。今天我们就来说说如何改变这一点。也就是说,我不在乎你指向哪里。如果我让你指着它,你就必须指着它。Function.prototype)在函数的原型上有三个方法callapplybind,只要是函数就可以调用这三个方法。这三个方法的作用就是改变函数的this点。下面分别介绍这三个方法准备一个函数constobj={name:'object'}constarr=[100,200,300]functionfn(a,b){console.group('打印fn函数里面的信息')console.log('a:',a)console.log('b:',b)console.log('this:',this)console.groupEnd()}fn(1,2)直接调用函数,根据this指向的规则,函数This里面会指向window1是传递给形参a的数据2是传递给形参b的数据调用方法语法:function.call(函数中的this点,parameterpassedtothefunction,theparameterpassedtothefunction)function:把函数中的this改成指向fn.call(obj,1,2)使用call调用fn函数。此时obj就是fn函数中的this。1是传递给形参a的数据,2是传递给形参b的数据数据应用方法语法:function.apply(函数中的this指针,类数组数据结构)功能:改变函数中的this指针功能。其实apply和call方法本质上是一样的,只是给函数传递参数的方法不同而已。第二个参数是一个类似数组的数据结构,只要按照索引排列即可,数据结构中的每一个都是依次给函数参数赋值的数据。fn.apply(arr,[10,20])使用apply调用fn函数。此时arr就是fn函数中的this点。第二个参数是一个数组。数组中的[0]数据是传递给形参a的数据。数组中的[1]数据传递给形参b。数据绑定方法语法:function.bind(function数字中的this点,传递给函数的参数,传递给函数的参数)功能:改变函数中的this点。其实bind和call方法本质上是一样的,只不过bind不会马上调用函数,而是返回一个加锁的嘛,这个新函数constres=fn.bind(obj,100,200)使用bind调用fn功能。此时obj就是你要设置的fn函数。函数中的this点100是传递给形参a的数据200是传递给形参b的数据但是实际上并没有立即执行fn函数,而是根据fn函数重现一个相同的函数,并且新函数被复制到res变量中,res函数中的this被锁定为obj。在浏览器中查看,我们会发现fn函数并没有被调用。那是因为bind本身不会调用fn函数。如果要指向它,需要通过res变量调用res()进行重构。上面我们介绍了三种方法的用法。如果你能很好的掌握,那我们就来看看这三个方法是如何实现的。调用方法重构//thisArg获取你要改变的this指针//args获取所有其余部分,负责传递给目标函数Function.prototype.myCall=function(thisArg,...args){thisArg=thisArg||windon//如果没有这个参数,则设置为windowconstfnKey=Symbol('fn')//创建一个唯一键作为函数的标识符thisArg[fnKey]=this//使用唯一标识符添加currentfunctiontothespecifiedobjectconstres=thisArg[fnKey](...args)//使用对象和唯一标识符调用Function,this相当于调用函数的对象,this点自然变了,这里不要忘记传入为函数准备的参数,并接受返回值deletethisArg[fnKey]//使用后删除Thistemporaryobjectmemberreturnres//只返回接收到的函数返回值}这样,我们的调用重构完成。apply方法重构其实和call方法类似对,只是参数不一样,但是根据调用方式的不同,我们不需要接受参数...args,直接接收即可//thisArg得到你要改变的this点//args得到剩下的所有内容,负责传递给目标函数Function.prototype.myApply=function(thisArg,args){thisArg=thisArg||window//如果没有这个参数,则设置为windowconstfnKey=Symbol('fn')//创建一个唯一键作为函数的标识符thisArg[fnKey]=this//使用唯一标识符添加currentfunctiontothespecifiedobjectconstres=thisArg[fnKey](...args)//使用对象和唯一标识符来调用函数,相当于调用函数的对象,this点自然就变了.这里别忘了传入为函数准备的参数,并接受返回值deletethisArg[fnKey]//使用后删除Dropthistemporaryobjectmemberreturnres//只返回接收到的函数返回值}bind方法重构这个方法其实很简单,只要使用之前重构的call或者apply方法就可以了//thisArg得到的就是你要改变的this点//args得到剩下的所有内容,负责传递给目标函数Function.prototype.myApply=function(thisArg,...args){constfn=this//使用变量保存目标函数//只返回一个新函数returnfunction(...innerArgs){//使用myApply方法调用目标函数,优先传递初始参数returnfn.myApply(fn,[...args,...innerArgs])}}现在bind的重构完成了,是不是这很简单!