函数 | call apply bind区别(含手写)
call apply bind都可用于修改this的指向
call
语法
1 | function.call(thisArg, arg1, arg2, ...) |
参数
thisArg
:在function函数运行时使用的this值,在非严格模式下,如果指定为null
或者undefined
,this
为window
arg1 arg2 arg3
:指定的参数列表
返回值
使用thisArg
和参数调用该函数的返回值,若该方法没有返回值,则返回undefined
apply
语法
1 | function.apply(thisArg, argsArray) |
参数
thisArg
:在function函数运行时使用的this值,在非严格模式下,如果指定为null
或者undefined
,this
为window
argsArray
:一个数组或者是类数组对象,其中数组元素将作为单独的参数传给function
函数,如果该参数的值为null
或者undefined
,则表示不需要传入任何参数
返回值
使用thisArg
和参数调用该函数的返回值,若该方法没有返回值,则返回undefined
bind
语法
1 | function.bind(thisArg, arg1, arg2, ...) |
参数
thisArg
:在function函数运行时使用的this值,在非严格模式下,如果指定为null
或者undefined
,this
为window
arg1 arg2 arg3
:指定的参数列表
返回值
返回一个绑定了指定的this
值和初始函数的原函数的拷贝
三者区别
call
和apply
: 传入形式不同,call
第二个参数开始都是function
所需要的参数,而apply
则把function
所需的参数以数组的形式作为第二个参数传入call
apply
和bind
:call 和 apply 是立即执行,而bind的方法是创建一个新的函数,这个函数是原函数的拷贝
手写实现
手写call
1 | Function.prototype.myCall = function(context,...args) { // ...rest: ...剩余参数数组名称 |
手写apply
1 | Function.prototype.myApply = function(context, args=[]) { |
手写bind
1 | Function.prototype.myBind = function(context, ...args) { |