call、apply、bind的区别和用法?

285 阅读1分钟

1.call

:函数名.call(this的指向,参数1,参数2)

改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

  function fun(){
		         console.log(this);
		     }
		     fun();//window
		     fun.call(document);
		     fun.call(1); //Number {1}
		     fun.call("1"); //String {"1"}
 var name = "杜甫"; //window.name
 var obj1 = {
     name:'`在这里插入代码片`李白',
     toString:function(){
         console.log(this.name);
     }
 }
 var obj2 = {
     name:'白居易',
     toString:function(){
         console.log(this.name);
     }
 }

 obj2.toString(); //白居易

 obj2.toString.call(obj1);//李白

obj2.toString.call(window); //杜甫

当第一个参数为nullundefined的时候,默认指向window(在浏览器中)

function fn(...args){
    console.log(this,args);
}
fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window

2.apply

: 函数名.apply(this,[参数1,参数2])

apply一样,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

 function fun1(a,b){
         console.log(this);
         console.log((a+b));
     }
     fun1.call(obj1,10,20);
     fun1.apply(obj1,[10,20]);

同样的,当第一个参数为nullundefined的时候,默认指向window(在浏览器中)

function fn(...args){
    console.log(this,args);
}
fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window

3.bind

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表,改变this指向后不会立即执行,而是返回一个永久改变this指向的函数

 function fun2(){
     console.log(this);
 }
 var f = fun2.bind(obj1); // function fun2(){console.log(obj1));}
 f();

从上面可以看到,applycallbind三者的区别在于:

  • 三者都可以改变函数的this对象指向
  • 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefinednull,则默认指向全局window
  • 三者都可以传参,但是apply是数组,而call是参数列表,且applycall是一次性传入参数,而bind可以分为多次传入
  • bind是返回绑定this之后的函数,applycall 则是立即执行