经典面试题:手撕一个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函数剩余参数、闭包等等,是一道综合性较高的面试题。


相关文章
|
2天前
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
|
2天前
|
前端开发 UED
【面试题】async/await 函数到底要不要加 try catch ?
【面试题】async/await 函数到底要不要加 try catch ?
|
2天前
|
自然语言处理 前端开发
阿里面试官:如何给所有的async函数添加try/catch?
阿里面试官:如何给所有的async函数添加try/catch?
|
2天前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
113 0
热点面试题:箭头函数与普通函数的区别?
热点面试题:箭头函数与普通函数的区别?
|
2天前
|
算法 Java C++
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
17 0
|
2天前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
15 0
|
2天前
|
算法 Java C++
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
23 0
|
2天前
|
Java Spring 容器
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
32 0
|
9月前
|
前端开发
面试官:箭头函数和普通函数的区别?箭头函数的this指向哪里?(二)
面试官:箭头函数和普通函数的区别?箭头函数的this指向哪里?(二)