zoukankan      html  css  js  c++  java
  • 三个方法(apply、call、bind)

    一、apply()和call()

    • 方法中如果没传入参数,或者是null,那么调用该方法的函数对象中的this就是默认的window
        <script>
            function f1(x,y){
                console.log(x+y+"======="+this)
            }
            f1.apply();//NaN=======[object Window]
            f1.apply(null);//NaN=======[object Window]
            f1.call();//NaN=======[object Window]
            f1.call(null);//NaN=======[object Window]
        </script>
    • apply和call方法都可以让函数或者方法来调用,传入参数和函数自己调用的写法不一样,但是效果是一样的
        <script>
            function f1(x,y){
                console.log(x+y+"======="+this)
            }
            f1(10,20);//30=======[object Window]
            f1.apply(null,[10,20]);//30=======[object Window]
            f1.call(null,10,20);//30=======[object Window]
        </script>
    • 作用:函数的调用,改变this的指向------在借用构造函数实现继承里也讲到过call方法
    • 使用方法:只要想使用别的对象的方法,并且希望这个方法是当前对象
        <script>
        //作用,调用函数,改变this的指向
            function Person(age){
                this.age=age;
            }
            Person.prototype.sayHi=function(x,y){
                console.log((x+y)+"=======>"+this.age);
            };
            function Student(age){
                this.age=age;
            }
            var per=new Person(10);//Person的实例对象
            var stu=new Student(100);//Student的实例对象
            //sayHi方法是per实例对象原型里面的方法
            //通过apply和call方法,stu调用了这个方法
            //sayHi方法里面的this,由原来的per变成了stu
            per.sayHi.apply(stu,[10,20]);//30=======>100
            per.sayHi.call(stu,10,20);//30=======>100
        //写法
        //函数名字/方法.apply(对象,[参数1,参数2,.....])
        //函数名字/方法.call(对象,参数1,参数2,.......)
        </script>
    • apply和call方法并不在函数这个实例对象中,而是在Function的原型prototype中

    二、bind()

    • bind方法是复制的意思,参数可以在复制的时候传进去,也可以在复制之后调用的时候传入进去
    • bind是在复制的时候改变this指向的,二apply和call是在调用的时候改变this指向的
    • 使用方法:
    1. 函数名字.bind(对象,参数1,参数2,...)------>返回复制后的函数
    2. 方法名字.bind(对象,参数1,参数2,...)------>返回复制后的方法
        <script>
        //使用方法:
        //1.函数名字.bind(对象,参数1,参数2,...)------>返回复制后的函数
        function f1(x,y){
            console.log(x+y);
        }
        var f2=f1.bind(null,10,20);
        f2();//30
        //2.方法名字.bind(对象,参数1,参数2,...)------>返回复制后的方法
        function Person(age){
            this.age=age;
        }
        Person.prototype.show=function(){
            console.log(this+"======"+this.age);
        };
        function Student(age){
            this.age=age;
        }
        var per=new Person(10);
        var stu=new Student(20);
        //stu对象使用bind复制了一份per的方法
        var ff=per.show.bind(stu);
        ff();//[object Object]======20
        </script>
    • 应用:通过对象,调用方法,产生随机数
        <script>
            //构造函数
            function showRandom(){
                //1-10的随机数
                this.number=parseInt(Math.random()*10+1);
            }
            //原型方法
            showRandom.prototype.show1=function(){
                //定时器里的this是window,通过bind把this指向改变成为了实例对象
                window.setInterval(this.show2.bind(this),1000);
            };
            showRandom.prototype.show2=function(){
                //显示随机数
                console.log(this.number);
            };
            //实例对象
            var sr=new showRandom();
            //调用方法,输出随机数字,调用一次,可以不停的产生(相同的)随机数字
            sr.show1();
        </script>
    •  补充:bind函数的用法
        <script>
            function fn(a,b,c,d,e,f){
                console.log(a,b,c);
                console.log(d,e,f);
            }
            // 绑定的同时传递参数,预传参,不调用
            var newFn = fn.bind(this,1,2,3)
            // 调用的时候传递参数,该参数会和预传递的参数合并到一起作为函数参数
            newFn() //1 2 3 undefined undefined undefined
            newFn(4,5,6) // 1 2 3  4 5 6
        </script>
  • 相关阅读:
    3. docker-compose实战--ghost app
    3. nacos服务发现
    1. nacos初识, 和eureka的比较, 在docker上安装nacos
    2.nacos服务配置中心
    如何将PHP对象数组转换成普通数组
    php 通过变量 来调用函数
    linux svn
    Sublime text 3安装svn插件
    php 字符串 定界符 json_last_error()
    centos7 rm -rf 删除文件的找回
  • 原文地址:https://www.cnblogs.com/EricZLin/p/9072691.html
Copyright © 2011-2022 走看看