前端/移动开发面试题更新 2026-08-05

请阐述在 JavaScript 中,call、apply 和 bind 这三个函数的手动实现思路,包括它们各自的作用、区别,以及实现时需要注意的关键细节。

前端/移动开发编码实现技术原理JavaScript

考察说明

考查对 JavaScript 中函数调用上下文控制原理的理解,以及能否手动实现这些原型方法。

回答思路

  1. 【回答框架 1】call、apply 和 bind 都是 Function 原型上的方法,用于改变函数执行时的 this 指向。call 和 apply 会立即调用函数,区别在于传递参数的方式:call 使用参数列表,apply 使用数组。bind 则不会立即执行,而是返回一个新函数,新函数的 this 被永久绑定到给定对象,且可以传入部分参数。
  2. 【回答框架 2】实现 call 的核心思路:将函数设为目标对象的一个临时属性,然后通过对象调用该函数,这样函数内部的 this 就指向该对象。调用后删除临时属性,并处理参数传递和返回值。对于基本类型的 this 值,需要进行装箱处理,例如使用 Object() 进行转换。
  3. 【回答框架 3】实现 apply 与 call 类似,区别在于参数以数组形式传入,需要将数组展开后作为函数参数。在 ES6 中可以使用展开运算符,在 ES5 中则通过 eval 或 apply 本身来实现。
  4. 【回答框架 4】实现 bind 时,需要返回一个新函数,该函数在调用时会将原函数的 this 绑定为传入的对象,并将 bind 时传入的参数与原函数调用时的参数合并。在实现时,要保留原函数的原型链,并考虑 new 操作符的情况:当 new 调用新函数时,this 应指向新创建的对象,而不是绑定的对象。
  5. 【回答框架 5】需要注意的细节:处理非函数调用情况(如 null/undefined 作为 this 时默认指向全局对象,严格模式下为 undefined);处理 Symbol 等特殊值;以及性能优化,避免使用 eval。
  6. 【关键点 1】call 和 apply 立即执行,bind 返回新函数。
  7. 【关键点 2】实现 call 的核心是通过对象临时属性调用函数。
  8. 【关键点 3】apply 的参数以数组形式传入,实现需展开数组。
  9. 【关键点 4】实现 bind 需考虑函数柯里化和 new 操作符。
  10. 【关键点 5】基本类型 this 需装箱,非函数调用需处理严格模式。
  11. 【易错点 1】使用 eval 实现 apply 存在性能和安全性问题,应尽量避免。
  12. 【易错点 2】未处理 null/undefined this 值在严格模式下的行为。
  13. 【易错点 3】未处理 bind 返回函数的 new 调用,导致 this 绑定失效。