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

调用、应用、绑定函数可以做什么?日常搬砖如何使用?(全部)

时间:2023-04-05 21:41:02 HTML5

call(),apply(),bind()函数可能大家都知道,但是在搬砖的过程中大概或者基本没有用到,学过却忘记了。但是在大量的第三方框架(库)中,甚至js本身在源码中大量使用call和apply函数。那么今天就和大家详细讨论下它们在开发中的应用场景。1.它们是什么意思?1.1函数它们的作用就是在函数内部改变this。这三个函数都是函数对象的方法,也就是说只有函数才能直接调用这些方法。ps:call、apply、bing属于this显示绑定,还有其他几种this绑定方法。如果你有兴趣,你可以点击这里。1.2三者参数不同:三个函数的第一个参数是this,需要绑定。call:可以有n个参数,从第二个参数开始的所有参数都是原函数的参数。`apply`:只有两个参数,第二个参数必须是数组,数组中的所有元素与原函数的参数一一对应。`bind`:只有一个参数,就是要绑定的this。调用语法:foo.call(this,arg1,arg2,...,argn);应用语法:foo.apply(this,[arg1,arg2,...,argn]);绑定语法:foo.bind(this);call:call,apply:调用后立即执行原函数。`bind`:调用后返回绑定this的函数。一个小例子:functionfoo(a,b){console.log(a+b);}foo.call(null,'海洋','饼干');//对于海洋饼干,如果这一点不重要,则写入nullfoo.apply(null,['ocean','cookies']);//海洋饼干varfun=foo.bind(null);乐趣('海洋','饼干');//海洋饼干2.他们可以做什么?这就是我们今天要讨论的话题。如何应用这三个功能?在什么情况下?我怎样才能改变这个方向?2.1处理伪数组(最常用)先考虑一个问题,如果用vararr=document.getElementsByTagName('li')获取5个li元素,现在需要获取第2、3、4三个元素,你会怎么办?这样的arr.slice(1,4);?哦,TypeError--arr.sliceisnotafunction(sliceisnotafunction),数组操作在日常搬砖中很常见,我见过最笨的解决这个问题的方法就是用循环,需要的元素一个一个地添加0.0到一个新的数组中。下面我介绍的方法,在实战中都可以使用。它可以为您的代码加分。非常方便简洁(是中高级前端程序员的基本操作)。首先,我们需要引入一个概念(伪数组),这就是为什么我们刚才切片数组时出错的原因:(新手比较干,懂的可以跳过)什么是a伪数组?(字面意思快出来了)有一个length属性,可以按索引存储数据,可以像数组一样遍历。push()和slice()等不能在数组中使用的方法只是可以像数组一样操作的对象,但是没有Array方法。js中有很多伪数组,比如:1、函数的arguments对象。2、getElementsByName()、getElementsByTagName()、childNodes/children等方法的返回值。3.还有就是比较常见的jquery,用它得到的元素也是伪数组。回到最初的问题,如何截取伪数组中的元素:伪数组没有这些方法,我们可以'借用'Array[].slice.call(arr,1,4);//推荐的写法不想借用可以直接给伪数组加上一个slice函数,比如arr.slice=[].slice;arr.slice(1,4);当然“借用”更方便,直接添加会造成伪数组对象的“污染”。如果原来的对象可以随意改变,可以直接转换成真正的数组对象。[].slice.call(arr);2.2继承的方式有很多种,我们现在讨论的一种是最重要的一种实现方式,使用call实现js的构造函数继承。单继承函数person(name){this.name=name}functionman(name){this.age='male';person.call(这个,名字);//继承man}varme=newman('Oceanbiscuit');控制台日志(我的名字,我的年龄);//'海洋饼干''男'多重继承functionperson(name){this.name=name}functionman(name){this.age='Male';}functionmanProgrammer(name){this.girlfriend=null;person.call(这个,名字);//继承人man.call(this,name);//继承man}varme=newmanProgrammer('Oceanbiscuit');console.log(我的名字,我的年龄,我的女朋友);//'Oceanbiscuit''male'null2.3thishardbinding---bind使一个对象强制和永久绑定到函数的this不能通过使用call,apply或其他绑定方法(除了new绑定,当然也可以手动push一个new无法更改的硬绑定)直接看例子:varfun;varobj={a:1,foo:function(){var_this=this;//你以前这样写过吗?为了防止this指向问题//将this赋值给一个变量,间接维护this的安全fun=function(){console.log(_this.a);}}}obj.foo();乐??趣();//1varobj1={a:2}obj.foo.call(obj1);//直接修改_this绑定的值,boomfun();//2但是这个方法感觉像是在回避问题,不直接用这个吗?这样真的不好解决问题的态度让我们用我们的bind来优化一下:varfun;varobj={a:1,foo:function(){//不要使用_this,避免不必要的变量声明fun=function(){安慰。日志(这个.a);}.bind(这个);//代码非常简洁漂亮(cellb)}}varobj1={a:2}obj.foo();fun();//1乐趣。呼叫(obj1);//1call,apply等绑定不能修改//这里call的位置和上面的不一样,因为this在不同的位置,所以替换了_this,很标准(zhuang)(b)ps:call,apply,bing属于这个显示绑定,这个绑定还有其他几种方法,有兴趣的可以点这里。2.4获取数组的最大值和最小值Math.max和min方法,接收多个参数,比较极值。这里使用了一个默认的apply函数:扩展数组,默认传入一个数组参数对数组进行转换。将每个参数的形式赋值给原函数varnum=[6,9,-3,-5];console.log(Math.max.apply(Math,num));//9等同于console.log(Math.max(6,9,-3,-5));console.log(Math.min.apply(Math,num));//-5等同于console.log(Math.min(6,9,-3,-5));2.5合并数组合并数组有3种常见的方式,1.循环2.数组的concat()3.使用apply()进行合并这里是最简单的apply使用方法vara=[1,2,3];varb=[4,5,6];[].push.apply(a,b);//借用数组的push方法等价于a.push(4,5,6);console.log(a);//[1,2,3,4,5,6]觉得对你有帮助,点个赞吧。555你有什么实用的黑科技?欢迎私信、评论、分享。我把id贴出来分享给大家>_