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;
    }
    

    加群一起进步

  • 相关阅读:
    PostgreSQL新手入门
    nodejs获取当前url和url参数值
    nodejs怎么同步从一个数据库查询函数中返回一个值
    linux几种快速清空文件内容的方法
    Redis常用命令(二)
    解读vscode断点调试配置文件【待续】
    以下公司【勿扰】
    思维定律与法则
    运行项目报错183
    css counter的使用方法
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545590.html
Copyright © 2011-2022 走看看