call , apply的this指向实现原理并自己实现封装
实现this指向原理
var value = 'value' var obj = { value: 'obj' } function func() { console.log(this.value) } func() // obj func.call(obj) // obj obj.func = func // 相当于obj变成了 obj = { value: 'obj', func: function func() {console.log(this.value)}} --创建后记得删除 obj.func() // obj 相当于调用obj内的func函数
实现this指向并传参原理
// 将newCall赋到Function的父对象上 Function.prototype.newCall = function () { var ctx = arguments[0] || window // 判断是否传了一个对象进来,如果有将this指向这个对象 ctx.fn = this var args = [] for(var i = 1; i<arguments.length; i++) { args.push('arguments[' + i + ']') } // args = ['arguments[i]','arguments[2]'].join(',') // eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。缺点是会改变作用域 var result = eval('ctx.fn(' + args.join(',') + ')') delete ctx.fn // 删除在ctx对象内创建的fn函数 return result }