1. Function.prototype.call = function (context) {
  2. // 1. 修改类型的方法
  3. var self = this
  4. // 2. 收集的参数
  5. var params = []
  6. // 3. 兼容null 如果是null的话 this指向window
  7. context = context || window
  8. // 4. 尽最大的可能性避免key重复 从而覆盖
  9. var funName = 'fn' + +new Date()
  10. // 5. 收集参数 从下标1开始
  11. for (var i = 1; i < arguments.length; i++) {
  12. params.push('arguments[' + i + ']')
  13. }
  14. // 6. 赋值临时属性
  15. context[funName] = self
  16. // 7. 通过eval 执行方法
  17. var result = eval('context[funName](' + params + ')')
  18. // 8. 删除临时添加的属性
  19. delete context[funName]
  20. return result
  21. }

1. 要点分析

  • 随机生成一个key值,将执行函数赋值给上下文的key属性
  • 执行方式有所不同,通过收集arguments来实现参数,以及通过eval来执行