函数的call和apply、bind

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <script>
        // function fn(a,b){
        //     console.log(a+b);
        // }

        // 函数名.call()或者函数名.apply()都是执行该函数
        // fn.();
        // fn.apply();

        // fn(4,5);
        // fn.call(null,4,5);//带入参数,是从第二位开始到后面按位给参数
        // fn.apply(null,[4,5]);//带入参数,第二位是一个数组,参数全部放在数组中

        // var arr=[2,4,7,2,1,3,4,5];
        // var max=Math.max.apply(null,arr);
        // Math.max(2,4,7,2,1,3,4,5);
        // var max=Math.max(...arr);
        // console.log(max);


        function abc(_a,_b){
            this.a=_a;
            this.b=_b;
            this.c=this.a+this.b;
        }

        // abc(3,6);
        // console.log(a,b,c);


        // var obj={};
        // call 改变函数内部this的指向
        // 将abc函数中的this指向call的第一个参数obj
        // abc.call(obj,3,6);
        // 将abc函数中的this指向apply的第一个参数obj
        // abc.apply(obj,[3,6]);
        // console.log(obj);


        var  obj={
            a:1,
            b:2,
            c:function(_a,_b){
                this.a+=_a;
                this.b+=_b;
                return this.a+this.b;
            }
        }

    //    var sum=obj.c(3,5);//11
    //    console.log(sum);

        var o={
            a:5,
            b:10
        }
        // var sum=obj.c.call(o,3,5);//23
        // var sum=obj.c.apply(o,[3,5]);//23
        // console.log(sum);


       
    //     [1,2,3,4,5,6]
       class Arrays{
           constructor(){

           }
           slice(start,end){
            //    console.log(this);
              if(start<0) start=this.length+start;
              if(end<0) end=this.length+end;
              if(start===undefined) start=0;
              if(end===undefined) end=this.length;
              var a=[];
                for(var i=start;i<end;i++){
                    a.push(this[i]);
                }
                return a;
           }
       }

       var arr=new Arrays(1,2,3,4,5);
       arr.slice(-3,-1);


       var divs=document.getElementsByTagName("div");
       arr=[].slice.call(divs);
       console.log(arr);
    

    //  var obj={
    //      a:1,
    //      abc:function(){
    //         var div=document.querySelector("div");
    //         div.addEventListener("click",this.clickHandler.call(this));
    //         // div.addEventListener("click",this.clickHandler);
    //      },
    //      clickHandler(e){
    //         //   this.a++;
    //         //   console.log(this.a);
    //        /*  var self=this;
    //         return function(){
    //             self.a++;
    //             console.log(self.a);
    //         } 
    //         // 疑问????过两天讲解
    //         */
    //      }
    //  }




    //  obj.abc();



    // function abc(_a,_b){
    //     this.a=_a;
    //     this.b=_b;
    //     console.log(this.a+this.b);
    // }

    // abc(3,6)
    // abc.call(null,3,6);
    // abc.apply(null,[3,6]);
    // var o={};
     // abc.call(o,3,6);
    // abc.apply(o,[3,6]);
    // var fn=abc.bind(o);//abc.bind(o) 
    // 将o带入到abc中,将this指向变为o,但是不执行这个函数,
    // 而是返回一个新函数,这个新函数的this就是o,原来abc函数中this不变
    // console.log(fn);
    // fn(3,6);
    // console.log(o);
    



      var obj={
         a:1,
         abc:function(){
            var div=document.querySelector("div");
            console.log(this.a);
            div.addEventListener("click",this.clickHandler.bind(this));
         },
         clickHandler(e){
           this.a++;
           console.log(this.a);
           e.currentTarget.removeEventListener("click",this.clickHandler);
        //    ?? 为什么不能删除
         }
     }
     obj.abc();


// 当使用call调用对象的函数时,第一个是null,c方法中的this将被指向谁
    // var obj1={
    //     a:1,
    //     b:2,
    //     c:function(){
    //         // this???
    //     }
    // }

    // obj1.c.call(null)


    // 2、bind绑定的事件如何删除


    // 3、如何重构bind方法
    </script>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // call apply bind  一般用在使用this的环境下

        // 对象的方法中
        // 事件函数
        // 面向对象class中


// 如果使用call,apply,bind 带入的对象是Null,则this被指向window
        // var b=20;
        // var  obj={
        //     a:function(){
        //         this.b++;
        //         console.log(this.b);
        //         console.log(this);
        //     },
        //     b:10
        // }
        // obj.a.call(null);


        // var b=100;
        // var obj={
        //     a:function(){
        //         // var arr=[2,3,4,5,6];
        //         // arr=arr.map(function(item){
        //         //     // 回调函数中this指向window
        //         //     return item+this.b;
        //         // }.bind(this));
        //         // // 外面的这层this是obj对象
        //         // console.log(arr);
                
        //         // setTimeout((function(){
        //         //     console.log(this.b);
        //         // }).call(this),2000);
        //         // 如果使用call会立即执行里面的函数,并且将this指向obj,会打印10,2秒什么也不执行

        //         // setTimeout(function(){
        //         //     console.log(this.b);
        //         // }.bind(this),2000);
        //         // 2s后打印10,外面的this是obj,被带入到函数中,将函数中this指向外面的this
        //         // document.self=this;//给侦听对象增加属性用来指向this,在函数中调用对于的self属性就可以
        //         //使用箭头函数在这里将this已经指向外部this,然后再执行后面的函数
        //         // document.addEventListener("click",e=>{this.clickHandler(e)});
        //         // 绑定this就是将事件函数中的this指向obj,当点击时调用
        //         // this.clickBind=this.clickHandler.bind(this);
        //         // document.addEventListener("click",this.clickBind);

        //     },
        //     clickHandler:function(e){
        //         // console.log(this.self);
        //         console.log("aaa");
        //         // 为什么删除不了事件?
        //         // 上面的事件侦听的bind和下面的这个删除事件bind返回函数不同
        //         document.removeEventListener("click",this.clickBind);
        //         this.clickBind=null;
        //     },
        //     b:10
        // }
        // obj.a();


    </script>
</body>
</html>
posted @ 2020-05-15 10:11  我是乐呀  阅读(123)  评论(0)    收藏  举报