call, apply, bind

2019-07-29  本文已影响0人  你喜欢吃青椒吗_c744

作用

call

定义:b.call(a) 就相当于把b里面的作用域强行指向到a里面去。
语法:

call([thisObj[,arg1[, arg2[, [,.argN]]]]])
function a(){   
  console.log(this);  
}       

function b(){}       

var c={name:"call"};    //定义对象c  
a();//window
a.call();   //window
a.call(null);   //window
a.call(undefined);   //window
a.call(1);   //Number
a.call('');   //String
a.call(true);   //Boolean
a.call(b);   //function b(){}
a.call(c);   //Object

例子1:

function eat(x,y){   
  console.log(x+y);   
}   
function drink(x,y){   
  console.log(x-y);   
}   
eat.call(drink,3,2);

//输出:5
//把eat的作用域指向drink
//eat.call(drink,3,2) == eat(3,2)

例子2:

function Animal(){   
  this.name="animal";   
  this.showName=function(){   
    console.log(this.name);   
  }   
}   
function Dog(){   
  this.name="dog";   
}   
var animal=new Animal();   
var dog=new Dog();       

animal.showName.call(dog);

//输出:dog

apply()

直观看callapply的区别:

function class1(args1,args2){       
  this.name=function(){      
   console.log(args,args);      
  }     
}     
function class2(){    
  var args1="1";
  var args2="2";
  class1.call(this,args1,args2);  
  /*或*/
  class1.apply(this,[args1,args2]);
}

var c=new class2();   
c.name();

输出:1 2
fn.call(obj, arg1, arg2, arg3...);
fn.apply(obj, [arg1, arg2, arg3...]);

call需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

如何抉择用call和apply

bind(es6)

bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。

var bar=function(){   
  console.log(this.x);   
}
var foo={ 
     x:3   
}   
bar();  
bar.bind(foo)();
 /*或*/
var func=bar.bind(foo);   
func();

输出:
//undefined
//3

参考文章

JS中的call、apply、bind方法

上一篇 下一篇

猜你喜欢

热点阅读