首页 > 技术文章 > call,apply,bind

dingdc 2020-08-10 10:55 原文

call,apply,bind三者的区别?

##
都是用来改变this指向的

call和apply都是function原型上的方法,每一个函数作为function的实例都可以调用这两个方法,而这两个方法都是用来改变this指向的

一般情况下this指向其调用者()

call

fun.call(thisArg,arg1,ary2,...)
主要作用可以实现继承
调用函数,改变this指向

var o={
    name:'kangkang'
};
function fn(a,b){
    console.log(this);  //不写call则指向window
    console.log(a+b);  //3
}
fn.call(o,1,2);

继承

function father(uname,age,sex){
    this.uname = uname;
    this.age = age;
    this.sex = sex;
}
function Son(uname,age,sex){
    father.call(this,uname,age,sex);
}
var son=new Son('张学友',18,‘男’);
console.log(son);
apply

fun.apply(thisArg,[argsArray])

  • thisArg:在fun函数运行时指定的this值
  • argsArray:传递的值,必须包含在数组里面
  • 返回值就是函数的返回值,因为它就是调用函数
var o={
    name:'kangkang'
};
function fn(arr){
    console.log(this);
    console.log(arr);
}
fn.apply(o);  //后面参数可省略
fn.apply(o,['pink']);

作用:调用函数,改变函数内部this指向
参数必须是数组
apply主要应用于借助数学对象等

var arr = [1,66,3,17];
var max = Math.max.apply(Math,arr);
var min = Math.min.apply(Math,arr);
console.log(max,min);
bind

bind()方法不会调用函数,但可以改变函数内部this指向
fun.bind(thisArg,arg1,arg2,...)
thisArg:在fun函数运行时指定的this值
arg1,arg2:传递的其他参数
返回由指定的this值和初始化参数改造的原函数拷贝

var o = {
    name:'andy'
};
function fn(a,b){
    console.log(this);
    console.log(a+b);
};
var f = fn.bind(o,1,2);
f();   //产生了一个新函数

call的性能要比apply好一些,尤其当传递参数超过3个,后期开发可多用call

let arr = [1,2,3];
obj = {};
function fn(a,b,c){
    fn.apply(obj,arr);  //a=[1,2,3]  b=c=undefined
    fn.call(obj,...arr);//基于ES6的展开运算符,可以将数组中的每一项依次传递给函数
    fn.call(obj,arr); 
}

时间测试

console.time('A')
...
...
console.timeEnd('a')

推荐阅读