Function.prototype.call = function (context) { // 1. 修改类型的方法 var self = this // 2. 收集的参数 var params = [] // 3. 兼容null 如果是null的话 this指向window context = context || window // 4. 尽最大的可能性避免key重复 从而覆盖 var funName = 'fn' + +new Date() // 5. 收集参数 从下标1开始 for (var i = 1; i < arguments.length; i++) { params.push('arguments[' + i + ']') } // 6. 赋值临时属性 context[funName] = self // 7. 通过eval 执行方法 var result = eval('context[funName](' + params + ')') // 8. 删除临时添加的属性 delete context[funName] return result}
1. 要点分析
- 随机生成一个key值,将执行函数赋值给上下文的key属性
- 执行方式有所不同,通过收集arguments来实现参数,以及通过eval来执行