关于call,bind,apply区别

call,bind,apply 相同点都是改变this的指向,传入参数。不同的是 call apply返回函数结果, bind 返回新函数.

apply 和 call 的区别是 call 方法接受的是若干个参数列表,而 apply 接收的是一个包含多个参数的数组。

bind()和call与apply不同。bind是新创建一个函数,然后把它的上下文绑定到bind()括号中的参数上,然后将它返回。

所以,bind后函数不会执行,而只是返回一个改变了上下文的函数副本,而call和apply是直接执行函数。

apply方法

apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行,且此方法只是临时改变thi指向一次。

日常用法:改变this指向

示例:

回调函数绑定this指向:

```

var name="martin";

var obj={

name:"lucy",

say:function(year,place){

console.log(this.name+" is "+year+" born from "+place);

}

};

var say=obj.say;

setTimeout(function(){

say.apply(obj,["1996","China"])

} ,0); //lucy is 1996 born from China,this改变指向了obj

say("1996","China") //martin is 1996 born from China,this指向window,说明apply只是临时改变一次this指向

```


call方法

call方法的第一个参数也是this的指向,后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,表示指向window(在浏览器中),和apply一样,call也只是临时改变一次this指向,并立即执行。

示例:

```

var arr=[1,10,5,8,3];

console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10

```

采纳以参数列表的形式传入,而apply以参数数组的形式传入。


bind方法

bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。

示例:

```

var arr=[1,10,5,8,12];

var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])

console.log(max(arr[4])); //12,分两次传参

```

可以看出,bind方法可以分多次传参,最后函数运行时会把所有参数连接起来一起放入函数运行

apply,call,bind三者的区别

三者都可以改变函数的this对象指向。

三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。

三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。

bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立即执行 。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容