Js中的Apply,Call,Bind

2020-01-08

func.apply(obj,args) 将函数应用于作用域之外的其他对象,接受数组形式参数
func.call(obj,arg1,arg2,...) 类似apply,可接受多个参数
func.bind(obj)(args) 更改函数绑定的this到obj上
func.bind(obj,args)
如果第一个参数为null,则this指向全局对象(window)

  1. 实现继承

    1
    2
    3
    4
    5
    6
    7
    function Person(name){   
    this.name=name;
    }
    function Student(name,school){
    Person.apply(this,arguments);
    this.school=school;
    }
  2. 不实现继承,只简单调用其他对象的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var A = {   
    name: 'A',
    call: function(someone){
    console.log(name+ ' calls ' + someone);
    }
    }
    var B = {
    name: 'B'
    }
    A.call('C'); // A calls C
    A.call.apply(B,'C'); // B calls C
  3. 提高程序性能

    1
    2
    3
    4
    arr = [5,6,8];
    Math.max(5,6,8); // 8
    Math.max(arr); // NaN,输入参数不能是数组
    Math.max.apply(null,arr); // 8
  4. 实现公共方法

    1
    2
    3
    4
    5
    6
    7
    8
    var call = function(){
    console.log('calls ' + this.name);
    };
    var A = { name: 'A' };
    var B = { name: 'B' };

    call.bind(A)(); // calls A
    call.bind(B)(); // calls B