js学习总结----call方法深入

     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
        */
原文地址:https://www.cnblogs.com/diasa-fly/p/7090746.html