call、apply、bind
call
、apply
和 bind
是挂在 Function
对象上的三个方法,只有函数才有这些方法
作用:改变函数执行时的 this
指向
1. call
fun.call(thisArg, arg1, arg2, ...)
thisArg
:在function
函数运行时使用的this
值- 非严格模式下:
thisArg
指定为null
,undefined
,fun
中的this
指向window
对象 - 严格模式下:
fun
的this
为undefined
- 值为原始值(数字,字符串,布尔值)的
this
会指向该原始值的自动包装对象,如String
、Number
、Boolean
- 非严格模式下:
arg1, arg2, ...
:指定的参数列表- 如果
arg
不传或为null
/undefined
,则表示不需要传入任何参数
- 如果
call()
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数
使用调用者提供的 this
值和参数调用该函数的返回值,若该方法没有返回值,则返回 undefined
function getInfo(arg1, arg2) {
console.log(arg1, arg2)
console.log(this.name);
}
let jsx = {
name: 'jsx'
}
let ljj = {
name: 'ljj'
}
getInfo.call(jsx, '蒋壮壮', '刘草草'); // 蒋壮壮 刘草草
2. apply
fun.apply(thisArg, argsArray)
-
thisArg
:在function
函数运行时使用的this
值- 非严格模式下:
thisArg
指定为null
,undefined
,fun
中的this
指向window
对象 - 严格模式下:
fun
的this
为undefined
- 值为原始值(数字,字符串,布尔值)的
this
会指向该原始值的自动包装对象,如String
、Number
、Boolean
- 非严格模式下:
-
argsArray
:可选的。一个数组或者类数组对象-
数组元素将作为单独的参数传给
func
函数 -
如果
argsArray
不传或为null
/undefined
,则表示不需要传入任何参数
-
apply()
方法调用一个具有给定this
值的函数,以及以一个数组或类数组对象的形式提供的参数
调用有指定 this
值和参数的函数的结果
function getInfo(...arg) {
console.log(arg)
console.log(this.name);
}
let jsx = {
name: 'jsx'
}
let ljj = {
name: 'ljj'
}
let arr = ['html', 'css', 'js']
getInfo.apply(ljj, arr); //ljj 'html', 'css', 'js'