【原生】 call、apply、bind 的基本使用方法,已经解析了某些源码

    function fn1(_a,_b){
            console.log(this);//  这个普通函数中this是window 
            this.a=_a;
            this.b=_b;
        }
        // fn1(5,6);

        // var  objs={
        //     fn:function(_a,_b){
        //         console.log(this);
        //         this.a=_a;
        //         this.b=_b;
        //     }
        // }

        // console.log(a,b);

        var obj={c:10};
        // 使用call,将第一个参数替代函数中this    (如果函数中没有this这样写就没有意义了,明白了call的用处了)
        fn1.call(obj,5,6);
        // 如果call的第一个参数是null,源函数中的this指向window
        // fn1.call(null,5,6);
        // console.log(obj);

  

        var  objs={
            fn:function(_a,_b){
                console.log(this);
                this.a=_a;
                this.b=_b;
            }
        }
        
        var obj={c:10}; 
        objs.fn.call(obj,5,6);//obj替代了fn函数中的objs对象,就是给obj添加了a和b属性
        console.log(objs,obj);

  

 var  objs={
            fn:function(_a,_b){
                console.log(this);
                this.a=_a;
                this.b=_b;
            }
        }

        var obj={c:10};
        // apply的作用和call一样,但是函数中参数是以数组形式给入
        objs.fn.apply(obj,[5,6])
        console.log(obj)

  

这样,我们传入一个数值,就可以知道不同的数值当中  最大值是那个了。       

var arr=[2,3,4,5,6]; var max=Math.max.apply(null,arr); //通过利用apply来解决 Math.max(3,4,5,6,7,8,9) var de=Math.max(3,4,5,6,7,8,9) console.log(de) console.log(max)

  

类和原型的关系,如果给一个原型上添加方法。就是下面这种方式了

 

        var arr = [1, 2, 3, 4, 5, 6];

        Array.prototype.slice1 = function (start, end) {
            if (start < 0) start = this.length + start;   //也就是start是负数的时候,数组的长度+负数那就是倒数的
            if (end < 0) end = this.length + end;   //  同上
            if (!start) start = 0;   //不填写时
            if (!end) end = this.length;    //不填写时
            var arr = [];
            for(var i=Math.round(start);i<Math.round(end);i++){
                arr.push(this[i]);
            };
            return arr;

        }

        console.log(arr.slice(-2))   //原生提供的
        console.log(arr.slice1(-2))   //自己模仿的



  // var arr=Array.prototype.slice.call(divs);   //divs是伪数组,   call代替了原来的this了

  

//bin绑定this

    //         var obj={a:1}
    //         // 因为回调函数需要在触发时才执行,不能使用call和apply,这两个会立即执行
    //         var handler=clickHandler.bind(obj);  //这样绑定是利于删除
    //           document.addEventListener("click",handler);
    //         // 函数.bind(对象),将函数中this绑定为对象,但是不执行,当触发执行时,this就是这个对象
    //         function clickHandler(e){
    //             console.log(this);
    //             document.removeEventListener("click",handler)
    //         }

// 下面这也是绑定函数,可以删除的写法
            // var clickHandler=(function(){

            // }).bind(obj);

  

猜你喜欢

转载自www.cnblogs.com/yuanjili666/p/11704586.html