call()、apply()、bind()
显式绑定:使用call()、apply()、bind()方法将this进行强制绑定(硬绑定)。
call()
的语法和作用与apply()
方法只有一个区别,就是call()
方法接受的是一个参数列表,而apply()
方法接受的是一个包含多个参数的数组。
call()
使用call()
方法会直接调用函数
function.call(this指向, 参数1, 参数2, ...)
this指向
:可选,用于修改函数this
指向,非严格模式下,指定null、undefined会自动指向全局window
参数1, 参数2, ...
传递给函数的实参
apply()
使用apply()
方法会直接调用函数
function.apply(this指向, [参数1, 参数2, ...])
this指向
:第一个参数用于修改函数this
指向
[参数1, 参数2, ...]
:一个数组或者类数组对象,其中的数组元素将作为单独的参数传给function函数。
bind()
使用bind()
方法不会不会不会直接调用函数
返回值
一个新函数
bind()
方法创建一个新的函数,在 bind()
被调用时,这个新函数的 this
被指定为 bind()
的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
function.bind(this指向, 参数1, 参数2, ...)
例:
bf
是bind
创建出来的函数,bf
函数内的this
指向己经被强硬指向了bind
的参数obj
(即对象{name:'liao'}
)
function fn() {
console.log(this)
}
let obj = { name:'liao'}
let bf = fn.bind(obj)
bf()
//{name: 'liao'}
一个小坑
bind
方法返回的新函数和原函数长得一样,但是内存地址不一样
function fn(){}
let fn2 = fn.bind({}) //fn2是新函数,和fn内存地址不一样
console.log(fn == fn2) //false
总结
call()
apply()
bind()
都可以替换修改函数this的指向call()
和apply()
会立马调用函数,call()
参数需要一个个的传,apply()
传参必须是数组形式bind()
会得到一个新函数, 这个函数绑定死了this
指向