call、apply、bind浅析

call(thisArgs [,args…])

该方法可以传递一个thisArgs参数和一个参数列表,thisArgs 指定了函数在运行期的调用者,也就是函数中的 this 对象,而参数列表会被传入调用函数中。
thisArgs 的取值有以下四种情况:

  • 不传,或者传null,undefined, 函数中的 this 指向window对象
  • 传递另一个函数的函数名,函数中的 this 指向这个函数的引用
  • 传递字符串、数值或布尔类型等基础类型,函数中的 this 指向其对应的包装对象,如 String、Number、Boolean
  • 传递一个对象,函数中的 this 指向这个对象

使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var a = {
name:'onepixel', //定义a的属性
say(){ //定义a的方法
console.log("Hi,I'm function a!");
}
};
function b(name){
console.log("Post params: "+ name);
console.log("I'm "+this.name);
this.say();
}
b.call(a,'test');

>>>
Post params: test
I'm onepixel
I'm function a!

当执行b.call 时,字符串test作为参数传递给了函数b,由于call的作用,函数b中的this指向了对象a, 因此相当于调用了对象a上的函数b,而实际上a中没有定义b 。


apply(thisArgs [,args[]])

apply 和 call 的唯一区别是第二个参数的传递方式不同,apply 的第二个参数必须是一个数组(或者类数组),而 call 允许传递一个参数列表。值得你注意的是,虽然 apply 接收的是一个参数数组,但在传递给调用函数时,却是以参数列表的形式传递


bind(thisArgs [,args…])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var obj = {name:'onepixel'};
/**
* 给document添加click事件监听,并绑定onClick函数
* 通过bind方法设置onClick的this为obj,并传递参数p1,p2
*/
document.addEventListener('click',
onClick.bind(obj,'p1','p2'),
false);
//当点击网页时触发并执行
function onClick(a,b){
console.log(
this.name, //onepixel
a, //p1
b //p2
)
}

一旦函数通过bind传递了有效的this对象,则该函数在运行期的this将指向这个对象,即使通过call或apply来试图改变this的指向也是徒劳的。


call、apply、bind浅析
https://jessnzz.github.io/2021/12/13/call、apply、bind浅析/
作者
Jessn
发布于
2021年12月13日
许可协议