zoukankan      html  css  js  c++  java
  • javascript 之 call,apply原理

    一、call原理

    1、使用JQuery的call功能

    var add(c,d){
       return this.a+this.b+c+d
    }
    var obj={a:1,b:2}
    
    add.Call(obj,3,4);
    //结果: 10


    观察:
    var o={
      a:1,
    b:2,
    add:function(c,d){
        return this.a+this.b+c+d;
    }
    }
    o.add(3,4);

    2、原理分析

    //先来看一下网上找的案例,建议跟着敲两边
     var add(c,d){
       return this.a+this.b+c+d   
    }
    var obj={a:1,b:2};
    
    Function.prototype.es6Call=function(context)
    {
        var context=context || window;
        context.fn=this;
        var args=[];
        for (var i=1,len=arguments;i<len;i++){
            args.push(arguments[i]);
       }   
       return context.fn(...args);
    }
    
    //调用
    add.es6Call(obj,3,4);  //结果:10
         
    

    3、思考

    在网上看到这样的一种语句
    function fn1(){
       console.log("这是FN1");
    }
    function fn2(){
       console.log("这是FN2");
    }
    
    //第一种:
    fn1.es6Call(fn2); //结果: 这是FN1
    分析:this本身指向的是fn1,fn1本身就是一个函数方法,那么就确定context.fn=fn1,所以无论是否有其他参数,那么都会执行fn1这个函数 //第二种: fn1.es6Call.es6Call(fn2); //结果: 这是FN2 分析:在调试过程中,context 指向的是 fn2, 但是 context.fn=this(此时,this就是 fn1.es6Call)这句话,让context.fn(...args) 返回值为undefine,也就是说this=fn.es6Call只是指向Funtion.prototype.es6Call本身,仅仅表示对象

    //有人会想,执行 fn1.es6Call().es6Call() //结果:报错

      

      

      

  • 相关阅读:
    小程序中上传图片并进行压缩
    vue在传值的时候经常遇到的问题
    【H5】移动开发 rem
    【入门】Less 知识点整理
    【入门】前后端交互
    原型对象、原型链
    跨域-jsonp、cors、iframe、document.domain、postMessage()
    css水平垂直居中
    localStorage、sessionStorage、cookie、session
    vue中父组件调用子组件函数
  • 原文地址:https://www.cnblogs.com/zmztya/p/11340584.html
Copyright © 2011-2022 走看看