zoukankan      html  css  js  c++  java
  • call、apply、bind

    三者的对比

    call、apply与bind都是用来改变this指向的。

    call与apply返回结果为函数调用结果,bind返回结果为新的函数,还需要重新调用

    let obj = {
        age: 18,
        getAge: function () {
            return this.age
        }
    }
    let obj2 = {
        age: 16
    }
    
    console.log(obj.getAge())   //18
    console.log(obj.getAge.call(obj2))  //16
    console.log(obj.getAge.apply(obj2)) //16
    console.log(obj.getAge.bind(obj2)())    //16(多一层调用)

    call、apply、bind第一个参数均为this指向对象。之后的参数call与bind都是依次传入,apply以数组的方式传入

    let obj = {
        age: 18,
        getAge: function (num1, num2) {
            return this.age + num1 + num2
        }
    }
    let obj2 = {
        age: 16
    }
    
    console.log(obj.getAge.call(obj2, 1, 2))  //19
    console.log(obj.getAge.bind(obj2, 1, 2)())    //19
    console.log(obj.getAge.apply(obj2, [1, 2])) //19    后面的参数以数组的形式传递进去

    bind的返回结果也可传入参数,会与bind函数的参数一起传入,如

    let obj = {
        age: 18,
        getAge: function (num1, num2) {
            return this.age + num1 + num2
        }
    }
    let obj2 = {
        age: 16
    }
    
    console.log(obj.getAge.bind(obj2, 1)(2))    //19

    封装bind

    Function.prototype.myBind = function (context, ...args) {
        return (...innerArgs) => {
            //innerArgs为bind函数返回结果即新函数中传入的参数,应与bind函数中传入的参数合并
            var finalArgs = args.concat(innerArgs)
            return this.apply(context, finalArgs)
        }
    }
  • 相关阅读:
    nyoj 139 我排第几个--康拓展开
    树形dp--hdu 3534 Tree
    hdu 2196 Computer 树形dp模板题
    poj 2342 Anniversary party 简单树形dp
    hdu 4738 Caocao's Bridges 图--桥的判断模板
    poj 1144 Network 图的割顶判断模板
    poj 3159 Candies 差分约束
    poj 3169 Layout 差分约束模板题
    codeforces C. Triangle
    java中过滤器、监听器、拦截器的区别
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/14435987.html
Copyright © 2011-2022 走看看