H5^Study

JS高级学习:apply和call 的使用/bind方法/高阶函

2019-04-23  本文已影响0人  Merbng

apply和call 的使用

// apply和call都可以改变this的指向
            function f1(x, y) {
                console.log("结果是:" + (x + y) + this);
            }
            window.f1(10, 20); //this是window
            function f1(x, y) {
                console.log((x + y) + ":===>" + this);
                return "这是函数的返回值";
            }
            // apply 和call 调用
            var r1 = f1.apply(null, [1, 2]); //此时f1中的this就是window
            console.log(r1);
            var r2 = f1.call(null, 1, 2); //此时f1中的this也是window
            console.log(r2);

            // 改变this的指向
            var obj = {
                sex: "男"
            };
            var r3 = f1.apply(obj, [1, 2]);
            console.log(r3);
            var r4 = f1.call(obj, 1, 2);
            console.log(r4);

apply和call的使用方法

bind方法

bind方法是复制的意思,参数可以在复制的时候传进去,也可以在复制之后调用的时候传进去

<script type="text/javascript">
            function f1(x, y) {
                console.log((x + y) + "=========" + this);
            }
            // bind方法是复制的意思,参数可以在复制的时候传进去,
            // 也可以在复制之后调用的时候传进去
            var ff = f1.bind(null, 10, 20);
            ff(10, 30);

            function Person() {
                this.age = 1000;
            }
            Person.prototype.eat = function() {
                console.log("哇咔咔");
            };
            var per = new Person();
            var f2 = f1.bind(per, 10, 20);
            f2();

            Person.prototype.play = function() {
                console.log(this + "=====" + this.age);
            };

            function Student(age) {
                this.age = age;
            };

            var per = new Person(10);
            var stu = new Student(20);
            // 复制了一份
            var ff = per.play.bind(stu);
            ff();//20  是学生的
            // bind是用来复制一份

bind方法的使用

案例:

<script type="text/javascript">
            // 展示随机数
            function ShowRandom() {
                // 1-10的随机数
                this.number = parseInt(Math.random() * 10 + 1);
            }
            ShowRandom.prototype.show1 = function() {
                window.setInterval(this.show2.bind(this), 1000);
            };
            ShowRandom.prototype.show2 = function() {
                // 展示随机数
                console.log(this.number);
            }
            var sr = new ShowRandom();
            // 调用这个方法一次,可以不停的产生随机数
            sr.show1();
        </script>

函数中的几个成员

函数中的属性:

  • name:函数的名字,name属性是只读的,不能修改
  • arguments:实参的个数
  • length:函数定义时候形参的个数
  • caller:调用(f1函数是在f2中调用的)
function f1(x, y) {
                console.log(f1.name);
                console.log(f1.arguments.length);
                console.log(f1.length);
                console.log(f1.caller);
            }
            f1.name = "个个矮柜 ";
            f1(10, 20, 30, 40);
            console.dir(f1);

            function f2() {
                console.log("f2的函数");
                f1(1, 2);
            };
            f2();

高阶函数之作为参数使用

函数作为参数的时候,如果是命名函数, 那么只传入函数的名字,没有括号

<script type="text/javascript">
            function f1(fn) {
                console.log("f1的函数");
                fn();
            }
            // fn是函数,最后作为函数使用了,函数是可以作为参数使用
            // 传入匿名函数
            f1(function() {
                console.log("这是匿名函数");
            });
            // 命名函数
            function f2() {
                console.log("f2的函数");
            }
            f1(f2);
            // 函数作为参数的时候,如果是命名函数,
            // 那么只传入函数的名字,没有括号
        </script>

高阶函数之作为返回值使用

案例:

<script type="text/javascript">
            function f1() {
                console.log("f1函数开始");
                return function() {
                    console.log("这是函数,但是此时作为返回值使用")
                };
            }
            var ff = f1();
            ff();


            var num = 10;
            console.log(typeof num); //获取num这个变量的数据类型
            var obj = {};
            console.log(obj instanceof Object); //判断这个对象是不是某个类型的
            //此时输出的是Object的数据类型  [object Object]
            console.log(Object.prototype.toString());
            // 输出的数组的数据类型 [object Array]
            console.log(Object.prototype.toString.call([]));

            var arr = [10, 20, 30];
            console.log(Object.prototype.toString.call(arr));
            console.log(Object.prototype.toString.call(new Date()));

            // 获取某个对象的类型是不是你传入的类型
            // type:是变量,是参数,  "[object Array]"
            // obj: 是变量,是参数,   [10,20,30];
            function getFunc(type) {
                return function(obj) {
                    return Object.prototype.toString.call(obj) == type;
                }
            }
            var ff = getFunc("[object Array]");
            var result = ff([10, 20, 30]);
            console.log(result);
        </script>
上一篇 下一篇

猜你喜欢

热点阅读