zoukankan      html  css  js  c++  java
  • es6手写一个call

    Function.prototype.selfCall = function(ctx, ...args) {
        if(typeof this !== 'function') {
            throw new Error('you must use call with function')
        }
        ctx = ctx || window
        //强绑定上ctx为执行上下为
        ctx.qdleader = this
        const res = ctx.qdleader(...args);
        //删除这个,防止影响外部对象的正常运行
        delete ctx.qdleader
        return res;
    }
    

    还有种es6写法

    Function.prototype.call3 = function(context) {
        context = context ? Object(context) : window;
        var fn = Symbol();
        context[fn] = this;
        
        let args = [...arguments].slice(1);
        let result = context[fn](...args);
        
        delete context[fn];
        return result;
    }
    

    那不用es6时候是咋写的呢?

    Function.prototype.call2 = function(context) {
        //若传入context是null或者undefined时指向window
        //若传入的是原始数据类型,原生的call会调用Object()转换
        context = context ? Object(context):window;
        //创建一个独一无二的fn函数的命名
        var fn = fnFactor(context)
        
        //这里的this就是指调用call的那个函数
        //将调用的这个函数赋值到context种,这样之后执行context.fn的时候,fn里的this就是指向context了
        
        context[fn] = this;
        
        //定义一个用于放arguments的每一项的的字符串:['arguments[1]','arguments[2]']
        var args = [];
        //要从第一项开始,第0项是context
        
        for(var i = 1; i < arguemts.length; i ++) {
            args.push("arguments["+ i +"]")
        }
        //使用eval()来执行fn并将args一个个传递进去
        var result = eval("context[fn]("+ args +")")
        delete context[fn];
        
        return result;
    }
    

    加群一起进步

  • 相关阅读:
    oracle安装
    Jmeter入门篇
    DOS常用命令
    SpringBoot中使用JNnit4(一)之Mockito的使用
    SpringBoot中使用JNnit4(入门篇)
    SpringBoot搭建
    SpringBoot中集成Swagger2
    jpa使用过程中出现问题记录[持续更新]
    Python逆向(五)—— Python字节码解读
    Python逆向(四)—— Python内置模块dis.py源码详解
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545590.html
Copyright © 2011-2022 走看看