zoukankan      html  css  js  c++  java
  • js中call,apply,bind的实现原理()

    // js中call,apply,bind的实现原理()
    // 三者的区别,都是改变this指针,call和apply主要是参数区别,bind返回的是一个函数体,而call和apply是立即执行
    // call的实现
    function fn1 (str1,str2,str3){
    console.log(this,str1,str2,str3);
    }
    function fn2(){

    }
    Function.prototype.call = function (context){
        // 避免传入的是基本类型,使用object进行对象化
        context = context ? Object(context) : window;
        context.fn = this;
        let args = [];
        for (let i = 1;i<arguments.length;i++) {
            args.push('arguments[' + i + ']');
        }
        // es数组的结构
        let r = eval("context.fn("+args + ")");
        delete context.fn;
        return r;
    }
    fn1.call('hellow',1,2,3);
    

    // apply的实现原理
    Function.prototype.apply = function (context,args){
    // 避免传入的是基本类型,使用object进行对象化
    context = context ? Object(context) : window;
    context.fn = this;
    if (args) {
    return eval("context.fn("+args + ")");
    }
    let argss = [];
    for (let i = 1;i<arguments.length;i++) {
    argss.push('arguments[' + i + ']');
    }
    // es数组的结构
    let r = eval("context.fn("+args + ")");
    delete context.fn;
    return r;
    }
    fn1.apply('hellow',[1,2,3]);
    //bin的实现的话,改变函数不要立即执行就可以

    猩猩爱宝贝儿
  • 相关阅读:
    BZOJ.4293.[PA2015]Siano(线段树)
    洛谷.T21778.过年(线段树 扫描线)
    HDU.6155.Subsequence Count(线段树 矩阵)
    BZOJ.3687.简单题(bitset)
    var let const的区别
    2、electron进程
    1、Electron入门HelloWorld案例
    JUnit@Before失效
    十一、Thymeleaf的基础使用
    九、SpringBoot集成Thymeleaf模板引擎
  • 原文地址:https://www.cnblogs.com/chengxuxing/p/12406255.html
Copyright © 2011-2022 走看看