var obj = {name:"张三"} function fn(){ console.log(this) } fn(); obj.fn(); // obj.fn is not a function fn.call(obj) //首先我们让原型上的call方法执行,在执行call方法的时候,我们让fn方法中的this变为第一个参数值obj;然后再把fn这个函数执行.
//自己模拟内置的call方法,写一个myCall方法,深入探讨call原理 Function.prototype.myCall = function(context){ /* myCall方法中的this就是当前我要操作和改变其this关键字的那个函数名 让this这个函数中的"this关键字"变成context */ //1、让fn中的this关键字变为context的值->obj eval(this.toString().replace('this',context)) //2、让fn方法执行 this(); } fn.myCall(obj);
//首先fn1通过原型链机制找到Function.prototype上的call方法,并且让call()方法执行->此时call这个方法中的this就是我要操作的fn1,在call方法代码执行过程中首先让fn1中的"this关键字"变成fn2,然后在让这个方法执行->1 fn1.call.call(fn2) /* 首先fn1通过原型链机制找到Function.prototype上的call方法,然后在让call方法通过原型在找到Function原型上的call(因为call本身的值也是一个函数,所以同样可以找到Function.prototype),在第二次找到call的时候让方法执行,方法中的this是fn1.call,然后让这个方法中的this变成fn2,最后fn1.call执行->2 */