callapply 的模拟实现

Posted izyk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了callapply 的模拟实现相关的知识,希望对你有一定的参考价值。

1. call的模拟实现

Function.prototype.myCall = function (context = window, ...args) 
  context = context || window  // 如果没有context参数,就返回window
    
  if (this === Function.prototype) 
    return undefined  // 直接调用Function.prorotype.myCall() 反回undefined       
  

  fn = Symbol()
  context[fn] = this  // 为context设置Symbol属性,并将当前函数赋给该属性
  const result = context[fn](...args)  // 将参数传入 
  delete context[fn]  // 删除该属性 
  return result         

Symbol属性特性: 唯一性,可以作为对象的属性,有静态属性Symbol.iterator

 

2. apply的模拟实现

Function.prototype.myApply = function (context = window, args) 
  context = context || window
  
  if (this === Function.prototype) 
    retrun undefined
  
  
  fn = Symbol()
  context[fn] = this

  let result
  if ( Array.isArray(args) ) 
    result = context[fn](...args)
    else 
    result = context[fn]()
  
  delete context[fn]  
  return result            

 

以上是关于callapply 的模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

js深入之实现callapply和bind

源码来袭:callapply手写实现与应用

JavaScript实现callapply和bind

原生JavaScript实现callapply和bind

原生JavaScript实现callapply和bind

一些字符和字符串库函数操作模拟实现