JS 面试问题: 手写 apply/call/bind ️‍♀️
创始人
2025-05-30 01:21:21
0

JS 面试问题: 手写 apply/call/bind 🕵️‍♀️

这是比较经典的面试题, 要明白考点就是函数调用时 this 究竟是谁的问题, 明白了这点一切就好说了.

手写 call/apply

先来看 callapply, 这两个方法很相近, 都是给定 this 和参数调用函数, 只不过 apply 的第二个参数是数组或者类数组对象, 而 call 可以接受很多个参数.

如果要我们自己实现函数调用时 this 值的绑定问题, 一定是 obj.func() 这种形式. 因为只有这种对象属性调用函数的方式, 函数的 this 才会是前面的对象, 即 obj.

function sayName(age) {console.log('this.sayName', this.name)console.log('age',age)
}Function.prototype.myCall = function(thisObj, ...args) {
}sayName.myCall({ name: levi }, 18)

上面就是大体的框架.

因为 call 接收的参数个数不定, 所以需要使用剩余参数的形式.

接下来的我们要知道的是 myCall 通过 sayName.myCall() 方式调用时的 this 就是 sayName. 所以…

Function.prototype.myCall = function(thisObj, ...args) {thisObj.testMethod = thisthisObj.testMethod(...args)delete thisObj.testMethod
}sayName.call({ name: 'levi' }, 18)
console.log('--------------------------------')
sayName.myCall({ name: 'levi' }, 18)

在这里插入图片描述

Function.prototype.myApply = function(thisObj, argsArray) {thisObj.testMethod = thisthisObj.testMethod(...argsArray)delete thisObj.testMethod
}sayName.apply({ name: 'levi' }, [18, 19, 20])
console.log('--------------------------------')
sayName.myApply({ name: 'levi' }, [18, 19, 20])

手写 bind

bind 返回一个绑定了 this 的函数, 因此我们实现的时候也需要在 myBind 中返回一个(匿名)函数, 在这个(匿名)函数中使用上面👆的原理.

Function.prototype.myBind =  function(thisObj) {thisObj.testMethod = thisreturn function(...args) {thisObj.testMethod(...args)delete thisObj.testMethod}
}console.log('--------------------------------')
sayName.bind({ name: 'levi' })(20)
sayName.myBind({ name: 'levi' })(20)

在这里插入图片描述

上面的方法都没有进行严格的参数校验, 可能存在 bug, 只是提供思路

谢谢你看到这里😊

相关内容

热门资讯

每周股票复盘:易德龙(6033... 截至2025年11月21日收盘,易德龙(603380)报收于35.04元,较上周的37.1元下跌5....
2026-27赛季亚冠中国球队... 随着中超联赛的落幕,2026-27赛季亚冠联赛中国球队的参赛资格也基本确定。中国足球在不断发展,球队...
原创 中... 日本虽派人登门协商,中方却在会后直言“不满意”,高市早苗焦头烂额之际,外媒开始给日本狂打鸡血,特朗普...
头皮发麻!吃烤肉时从嘴里掉出一... 近日,有市民向广州日报新花城记者反映,在与朋友食用烤肉的过程中,朋友吃着与烤肉搭配的生菜时口里有“诡...
每周股票复盘:万林物流(603... 截至2025年11月21日收盘,万林物流(603117)报收于5.22元,较上周的5.47元下跌4....
每周股票复盘:上海亚虹(603... 截至2025年11月21日收盘,上海亚虹(603159)报收于21.69元,较上周的23.1元下跌6...
每周股票复盘:新五丰(6009... 截至2025年11月21日收盘,新五丰(600975)报收于6.11元,较上周的6.38元下跌4.2...
每周股票复盘:大参林(6032... 截至2025年11月21日收盘,大参林(603233)报收于17.57元,较上周的18.61元下跌5...
每周股票复盘:迎驾贡酒(603... 截至2025年11月21日收盘,迎驾贡酒(603198)报收于41.63元,较上周的42.92元下跌...
每周股票复盘:煤炭智能化政策推... 截至2025年11月21日收盘,天玛智控(688570)报收于18.26元,较上周的19.57元下跌...