实现一个函数 myCall(fn, context, ...args),模拟 Function.prototype.call

推荐答案

-- -------------------- ---- -------
-------- ---------- -------- -------- -
  -- -- ------- - ---- - ------------------------ -------
  ------- - ------- -- -------
  
  -- - -- -- ------- -----
  ---------- - ---
  
  -- -- ------- -- -- --------
  ----- ------ - --------------------
  
  -- -- ------- -- -- --
  ------ -----------
  
  -- ------
  ------ -------
-

本题详细解读

1. 函数功能

myCall 函数模拟了 Function.prototype.call 的功能。它允许你在指定的 context 上下文中调用一个函数 fn,并可以传递任意数量的参数 args

2. 参数说明

  • fn: 需要调用的函数。
  • context: 函数执行时的上下文对象,即 this 指向的对象。
  • ...args: 传递给函数的参数列表。

3. 实现步骤

  1. 处理 context: 如果 contextnullundefined,则默认使用全局对象(在浏览器中是 window)。
  2. 绑定函数: 将 fn 作为 context 的一个属性,这样在调用时 this 就会指向 context
  3. 调用函数: 使用 context.fn(...args) 的方式调用函数,并传入参数。
  4. 清理属性: 调用完成后,删除 context 上的 fn 属性,避免污染 context 对象。
  5. 返回结果: 返回函数调用的结果。

4. 示例

-- -------------------- ---- -------
-------- --------------- -
  ------ ------------- ---------------
-

----- ------ - -
  ----- -------
--

------------------------- ------- ---------- -- --- ------- -------

在这个示例中,greet 函数在 person 对象的上下文中被调用,this.name 指向 person.name,因此输出为 "Hello, Alice!"

纠错
反馈