• 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
            */
  • 相关阅读:
    sql知识
    铁道部新客票系统设计(三)
    PYTHON压平嵌套列表
    快速升级App支持iOS6及iPhone5的4寸屏幕
    TreeListView
    杭州ADC技术嘉年华两日总结SOA,去C
    .NET(C#): Task.Unwrap扩展方法和async Lambda
    关于分布式系统的数据一致性问题
    wcf 随笔1
    Linux进程基础
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7090746.html
Copyright © 2020-2023  润新知