call,apply,bind的用法
首先要知道call、apply、bind 的主要作用都是改变 this 的指向,下面介绍它们的具体区别和使用方法
call
call 的写法:Function.call(obj,[param1[,param2[,…[,paramN]]]])
需要注意以下几点:
调用 call 的对象,必须是个函数 Function。
call 的第一个参数,是一个对象。 Function 的调用者,将会指向这个对象。如果不传,则默认为全局对象 window。
第二个参数开始,可以接收任意个参数。每个参数会映射到相应位置的 Function 的参数上。但是如果将所有的参数作为数组传入,它们会作为一个整体映射到 Function 对应的第一个参数上,之后参数都为空。
1
2
3
4
5
6
7function func(a, b, c) {}
func.call(obj, 1, 2, 3);
// func 接收到的参数实际上是 1,2,3
func.call(obj, [1, 2, 3]);
// func 接收到的参数实际上是 [1,2,3],undefined,undefined
apply
apply 的写法Function.apply(obj[,argArray])
需要注意的是:
- 它的调用者必须是函数 Function,并且只接收两个参数,第一个参数的规则与 call 一致。
- 第二个参数,必须是数组或者类数组,它们会被转换成类数组,传入 Function 中,并且会被映射到 Function 对应的参数上。这也是 call 和 apply 之间唯一的区别
1 |
|
bind
bind 的写法:Function.bind(thisArg[, arg1[, arg2[, ...]]])
bind 方法 与 apply 和 call 比较类似,也能改变函数体内的 this 指向。不同的是,bind 方法的返回值是函数,并且需要稍后调用,才会执行。而 apply 和 call 则是立即调用。
来看下面这个例子:
1 |
|
总结
从上面可以看到,appl、call、bind 三者的区别在于:
- 三者都可以改变函数的 this 对象指向
- 三者第一个参数都是 this 要指向的对象,如果如果没有这个参数或参数为 undefined 或 null,则默认指向全局 window
- 三者都可以传参,但是 apply 是数组,call 是参数列表,且 apply 和 call 是一次性传入参数,而 bind 可以分为多次传入
- bind 是返回绑定 this 之后的函数,apply 、call 则是立即执行
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!