• javascript中的call(),apply(),bind()方法的区别


    之前一直迷惑,记不住call(),apply(),bind()的区别。不知道如何使用,一直处于懵懂的状态。直到有一天面试被问到了这三个方法的区别,所以觉得很有必要总结一下。

    如果有不全面的地方,后续再进行补充。

    1. 改变this的指向

    var obj = {
        name : '张三',
        age : 17,
        myFun : function () {
            console.log(this.name + ' ' + this.age);
        }
    }
    var obj2 = {
        name : '李四',
        age : 20
    }
    obj.myFun() //张三 17
    obj.myFun.apply(obj2) //李四 20
    obj.myFun.call(obj2) //李四 20
    obj.myFun.bind(obj2)() //李四 20

    由例子可以看出,apply,call,bind都对this进行了重定向,apply和call使用方法相同。但是bind后面多了个(),因为bind返回的是一个全新的函数,但是三个返回结果一致。

    2. 传参情况不同

    var obj = {
        name : '张三',
        age : 17,
        myFun : function (active,fm) {
            console.log(this.name + ' ' + this.age + active + fm);
        }
    }
    var obj2 = {
        name : '李四',
        age : 20
    }
    obj.myFun.apply(obj2,['爱学习','北京']); //李四 20爱学习北京
    obj.myFun.call(obj2,'爱学习','北京'); //李四 20爱学习北京
    obj.myFun.bind(obj2,'爱学习','北京')(); //李四 20爱学习北京
    obj.myFun.call(obj2,['爱学习','北京'])();//李四 20爱学习,北京undefined

    可以发现:apply参数传递用数组,并且在方法中会自动匹配参数

                      call参数传递是直接放进去,每个参数之间用逗号隔开

                      apply如果用和call类似的传递参数的方法,则在方法中会自动匹配参数。若像apply一样传递参数,则会把整个数组                       当作一个参数传递进去。

  • 相关阅读:
    BZOJ 4726: [POI2017]Sabota? 树形dp
    Codeforces Round #381 (Div. 1) B. Alyona and a tree dfs序 二分 前缀和
    uestc_retarded 模板
    CROC 2016
    Codeforces Round #381 (Div. 1) A. Alyona and mex 构造
    BZOJ 2648: SJY摆棋子 kdtree
    BZOJ 3732: Network 最小生成树 倍增
    HDU 5914 Triangle 数学找规律
    HDU 5902 GCD is Funny 数学
    Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
  • 原文地址:https://www.cnblogs.com/zgsxh/p/9471421.html
Copyright © 2020-2023  润新知