经典面试题:手撕一个bind函数

简介: 在前端面试中,this指向、闭包理解与应用、原型 Prototype等知识点都是经常考察的。那有没有面试题会一次性涉及到这三块儿呢?当然是有的!

前言


在前端面试中,this指向、闭包理解与应用、原型 Prototype等知识点都是经常考察的。那有没有面试题会一次性涉及到这三块儿呢?当然是有的!


手撕一个bind函数就是这样一道经典的面试题!


原生bind函数


bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。


引自MDN


举个栗子🌰:


// 创建Person类
class Person {
  // 定义私有属性 name/age
  private name: string;
  private age: number;
  // 构造函数,初始化时指定name、age的值
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  // 定义printInfo方法,输出信息
  printInfo(sex: string) {
    console.log(this.name, this.age, sex);
  }
}
// 实例化类,获取对象
const p = new Person("Jack", 12);
// 调用printInfo方法
p.printInfo("男"); // Jack 12 男
// 使用bind更改this指向,同时传入参数,返回一个新函数
const printInfo = p.printInfo.bind({ name: "rose", age: 11 }, "女");
// 调用函数
printInfo(); // rose 11 女


梳理一下bind函数的特点:


  1. bind调用完成,返回的是一个新函数;


  1. bind调用时,传入的第一个参数是新的this对象,后续其他参数作为了返回的新函数调用时的参数值


通过prototype自定义bind函数的实现


Up Code ~ 上代码 ~


/**
 * @description 自定义bind方法实现
 * @param context any 传入的this对象
 * @param bindArgs any[] 传入的参数
 */
// @ts-ignore
Function.prototype.myBind = function (context: any, ...bindArgs: any[]) {
  // 原函数的this
  // @ts-ignore
  const self: any = this;
  // 返回一个新函数 - 返回的新函数也是可以继续传递参数的
  return function (...args: any[]) {
    // 最终的参数
    const finalArgs = bindArgs.concat(args);
    // 返回原函数的执行结果
    return self.apply(context, finalArgs);
  };
};


这里一定要注意,.myBind = function () {}位置,不能使用箭头函数,因为一旦使用箭头函数,this指向就确定了,self变量就不能再指向调用myBind的函数了


功能测试:


// @ts-ignore
const printInfo2 = p.printInfo.myBind({ name: "rose", age: 11 }, "女");
printInfo2(); // rose 11 女


相当完美~


结语


手撕一个bind函数这道面试题,考察的知识点还是非常多的,this指向问题、prototype原型问题、ES6函数剩余参数、闭包等等,是一道综合性较高的面试题。


相关文章
|
6天前
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
|
6天前
|
前端开发 UED
【面试题】async/await 函数到底要不要加 try catch ?
【面试题】async/await 函数到底要不要加 try catch ?
|
6天前
|
自然语言处理 前端开发
阿里面试官:如何给所有的async函数添加try/catch?
阿里面试官:如何给所有的async函数添加try/catch?
|
4天前
|
数据采集 Python
10个Python set 常用操作函数!,bilibili面试题
10个Python set 常用操作函数!,bilibili面试题
10个Python set 常用操作函数!,bilibili面试题
|
4天前
|
数据采集 数据挖掘 关系型数据库
Excel计算函数(计算机二级)(1),2024年最新2024Python架构面试指南
Excel计算函数(计算机二级)(1),2024年最新2024Python架构面试指南
|
4天前
|
存储 Java Shell
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
|
5天前
|
机器学习/深度学习 数据采集 自然语言处理
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
|
6天前
|
存储 JavaScript 前端开发
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
|
6天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
28 0
|
6天前
|
算法 搜索推荐 C++
浅谈sort函数底层(一道c++面试的天坑题)
浅谈sort函数底层(一道c++面试的天坑题)