javascriptjs

JavaScript call()、apply()、bind()

2021-08-09  本文已影响0人  邓立_全栈UncleLi

今天又是连续暴雨的一天,已连续下雨好几周了。房间里黑漆漆的,突然想到JavaScript 的call()、apply()、bind()三个函数。。。人家都在想女友,而我此时此刻想到了代码,太惨了。。。一脸懵逼,还忘记了它们的区别,果然雨下得连脑子都不好使了。。。

let bigBaby = {
    name: '大宝',
    age: 81,
    ageFun: () => {
        console.log(this.name + "年龄:" + this.age)
    },
    descFun: (height , weight, hobby) => {
        console.log(this.name + "年龄:" + this.age + " 身高:" + height + "米 体重:" + weight + " 爱好:" + hobby)
    }
}

let littleBaby = {
    name: '小宝',
    age: 18
}

bigBaby.ageFun.call(littleBaby)    // undefined年龄:undefined
bigBaby.ageFun.apply(littleBaby)    // undefined年龄:undefined
bigBaby.ageFun.bind(littleBaby)()   // undefined年龄:undefined
let bigBaby = {
    name: '大宝',
    age: 81,
    ageFun: function () {
        console.log(this.name + "年龄:" + this.age)
    },
    descFun: function (height , weight, hobby) {
        console.log(this.name + "年龄:" + this.age + " 身高:" + height + "米 体重:" + weight + " 爱好:" + hobby)
    }
}

let littleBaby = {
    name: '小宝',
    age: 18
}

bigBaby.ageFun.call(littleBaby)    // 小宝年龄:18
bigBaby.ageFun.apply(littleBaby)    // 小宝年龄:18
bigBaby.ageFun.bind(littleBaby)()      // 小宝年龄:18

call()、apply()、bind() 三个函数都是用来重定义 this 这个对象的,把原本 bigBaby 的方法重定义为 littleBaby 的方法,所以读取到的 age 是
littleBaby 定义的 18 岁
call、apply 直接执行函数,bind 返回的是一个新的函数,所以要调用它才会被执行

let bigBaby = {
    name: '大宝',
    age: 81,
    ageFun: function () {
        console.log(this.name + "年龄:" + this.age)
    },
    descFun: function (height, weight, hobby) {
        console.log(this.name + "年龄:" + this.age + " 身高:" + height + "米 体重:" + weight + " 爱好:" + hobby)
    }
}

let littleBaby = {
    name: '小宝',
    age: 18
}

bigBaby.descFun.call(littleBaby, 2, '200斤', (() => '篮球')())    // 小宝年龄:18  身高:2米 体重:200斤 爱好:篮球
bigBaby.descFun.apply(littleBaby, [2, '200斤', (() => '篮球')()])   // 小宝年龄:18  身高:2米 体重:200斤 爱好:篮球
bigBaby.descFun.bind(littleBaby, 2, '200斤', (() => '篮球')())()      // 小宝年龄:18  身高:2米 体重:200斤 爱好:篮球

除了第一个参数,后面的参数都是函数的入参
call 的参数是直接放进去的,全都用逗号分隔,直接放到后面 bigBaby.descFun.call(littleBaby, 2, '200斤', (() => '篮球')())
apply 的所有参数都必须放在一个数组里面传进去 bigBaby.descFun.apply(littleBaby, [2, '200斤', (() => '篮球')()])
bind 的参数是直接放进去的,全都用逗号分隔,直接放到后面,和 call 一样 bigBaby.descFun.bind(littleBaby, 2, '200斤', (() => '篮球')())()
三者的参数允许是各种类型

上一篇下一篇

猜你喜欢

热点阅读