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

一、作用:

  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 

posted @ 2024-11-16 14:47  yangkangkang  阅读(6)  评论(0编辑  收藏  举报