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


相关文章
|
7月前
|
存储 SQL 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
109 0
|
1月前
|
SQL Oracle 关系型数据库
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
本文介绍了多种SQL内置函数,包括单行函数、非空判断函数、日期函数和正则表达式相关函数。每种函数都有详细的参数说明和使用示例,帮助读者更好地理解和应用这些函数。文章强调了字符串操作、数值处理、日期计算和正则表达式的使用方法,并提供了丰富的示例代码。作者建议读者通过自测来巩固学习成果。
20 1
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
|
4月前
|
机器学习/深度学习
【机器学习】如何判断函数凸或非凸?(面试回答)
文章介绍了如何判断函数是凸函数还是非凸函数,包括凸函数的定义、几何意义、判定方法(一元函数通过二阶导数判断,多元函数通过Hessian矩阵的正定性判断),以及凸优化的概念和一些经典的凸优化问题。
216 1
【机器学习】如何判断函数凸或非凸?(面试回答)
|
4月前
|
JavaScript
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
这篇文章解释了为什么在Vue中组件的`data`属性必须是一个函数而不是一个对象。原因在于组件可能会有多个实例,如果`data`是一个对象,那么这些实例将会共享同一个`data`对象,导致数据污染。而当`data`是一个函数时,每次创建组件实例都会返回一个新的`data`对象,从而确保了数据的隔离。文章通过示例和源码分析,展示了Vue初始化`data`的过程和组件选项合并的原理,最终得出结论:根实例的`data`可以是对象或函数,而组件实例的`data`必须为函数。
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
|
5月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
62 8
|
4月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
5月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
84 6
|
7月前
|
机器学习/深度学习 数据采集 自然语言处理
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
|
7月前
|
数据采集 Python
10个Python set 常用操作函数!,bilibili面试题
10个Python set 常用操作函数!,bilibili面试题
10个Python set 常用操作函数!,bilibili面试题
|
7月前
|
算法
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈