首页 > 其他分享 >bind、call、apply区别?如何实现?

bind、call、apply区别?如何实现?

时间:2024-11-16 14:40:48浏览次数:1  
标签:name 指向 bind 参数 apply call

一、作用:

  call、apply、bind 作用是改变函数执行的上下文,简而言之就是改变函数运行时的this指向

二、区别

  call: 

    1. 传入的参数不固定

     2.第一个参数是this绑定的对象,后面其余的参数是传入函数执行的参数列表

    3. 第一个参数为null、undefined的时候,默认指向window

    4. 改变this指向后原函数会立即执行,且此方法之时临时改变this一次

  apply:

    1.接收两个参数

     2.第一个参数是this绑定的对象,第二个参数是函数接受的参数,以数组的形式传入

 

              3. 第一个参数为null、undefined的时候,默认指向window

 

     4. 改变this指向后原函数会立即执行,且此方法之时临时改变this一次

 

  bind:

 

             1. 传入的参数不固定

 

     2.第一个参数是this绑定的对象,后面其余的参数是传入函数执行的参数列表(但这个列表可以分多次传入)

    3.第一个参数为null、undefined的时候,默认指向window

    4. 改变this指向后不会立即执行,而是返回一个永久改变this指向的函数

    5. 多个连续bind,最后this指向第一次调用bind方法的参数决定

            function fn (...args){
                console.log(this,args)
            }
            let obj = {
                name:'张三'
            }
            let obj2 = {
                name:'张三2'
            }
            // apply改变this指向,会立即执行
            fn.apply(obj,[1,2]) // {name:'张三'} [1,2]
            fn([3,4]) // window

            // call改变this指向,会立即执行
            fn.call(obj,5,6)  // {name:'张三'} [5,6]
            fn()  //window


            // bind改变this指向,不会立即执行,需要手动调用,参数可分多次传入,多次bind,this指向第一个对象
            const fn1 = fn.bind(obj,5,6).bind(obj2,7,8)
            fn1() //  {name:'张三'}  [5,6,7,8]
            fn1(9,0) // {name:'张三'} [5,6,7,8,9,0]  

 

三、手写实现call、bind、apply 函数

  手写call、bind、apply 

标签:name,指向,bind,参数,apply,call
From: https://www.cnblogs.com/yangkangkang/p/18549354

相关文章

  • 记一次切面中读取请求体报错 Cannot call getReader()
    问题写了一个切面来处理被指定自定义注解标注的方法:@Slf4j@Aspect@Component@RequiredArgsConstructorpublicclassMyAnnoAspect{privatefinalHttpServletRequestrequest;@Around("@annotation(myAnno)")publicObjecthandleMyAnno(ProceedingJoinPo......
  • useCallback 和 useMemo 使用场景
     一切为了性能,无论是useCallback还是useMemo还是memo,都是为了让不该渲染的组件不去渲染在学习useCallback、useMemo之前,我们需要知道一点,React的渲染是自顶而下,如果父组件渲染了,那么子组件也会渲染,其子孙组件“世世代代”都要渲染但如果父组件的渲染与子组件的pr......
  • Java:An attempt was made to call a method that does not exist. The attempt was ma
    1.问题描述一个字段的类型从int变成了bigint,实体类也要同步更新为Long。修改完后只更新了这个类,结果运行就报错了。根据日志来看说“EntityKsGc.getKscc()Ljava/lang/Long;”这个方法不存在,但就是修改这个类,改成了Long类型,确确实实存在,另外从eclipse来看,也只提示修改了......
  • 织梦自定义图片字段报错 Call to a member function GetInnerText()
    问题:添加自定义图片字段时,前台打开当前栏目列表出现 Fatalerror:CalltoamemberfunctionGetInnerText()onstring 错误。解决方法:修改 customfields.func.php 文件:打开 /include/customfields.func.php 文件,搜索:  $fvalue=trim($ntag->GetInnerTe......
  • tips1:WPF绑定的一种情况 Binding
    <CheckBoxMargin="10"VerticalAlignment="Center"IsChecked="{BindingRelativeSource={RelativeSourceTemplatedparent},Path=IsExpanded}"/>CheckBox的IsChecked属性使用了数据绑定机制,以实现与TemplatedParent......
  • 汇编语言-CALL和RET指令
    call和ret都是转移指令,修改Ip或同时修改csip。1.ret和retfret指令用栈中的数据,修改ip的内容。从而实现近转移retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移。CPU执行ret指令时,进行下面两步操作(IP)=((SS)*16+(SP))(SP)=(SP)+2相当于POPIPCPU执行retf指令时进行下......
  • syscall
    syscall分析_syscall_的相关参数:intptr_t_syscall_(intptr_ttype,intptr_ta0,intptr_ta1,intptr_ta2){registerintptr_t_gpr1asm(GPR1)=type;registerintptr_t_gpr2asm(GPR2)=a0;registerintptr_t_gpr3asm(GPR3)=a1;registerintptr_t_......
  • ECE 498/598 Associative Recall Problem
    ECE498/598Fall2024,Homeworks3and4Remarks:HW3&4:Youcanreducethecontextlengthto32ifyouarehavingtroublewiththetrainingtime.HW3&4:Duringtestevaluation,notethatpositionalencodingsforunseen/longcontextarenottrai......
  • 【转】[Java][Idea] 打开时报错 Internal error. Address already in use: bind
    方法一:netshwinsockreset以管理员身份运行cmd执行这个命令,然后重启电脑。 方法二:按报错提示,访问  https://jb.gg/ide/critical-startup-errors  按文章,可以参考 https://youtrack.jetbrains.com/issue/IDEA-238995解决问题 以下是文章摘抄:ReviseIDEdire......
  • web 接入 bind map
    <scripttype='text/javascript'src='http://www.bing.com/api/maps/mapcontrol?branch=release&callback=loadMapScenario'asyncdefer></script>functionloadMapScenario(){varmyStyle1={......