call函数的使用
let name = "张三"; //全局变量
function fn(a, b, c, d) {
console.log(a, b, c, d); //1 2 3 4
console.log(this.name, "this.name"); //改变了this指向,指向了pointObj //王二
}
let pointObj = { name: "王二" };
fn.call(pointObj, 1, 2, 3, 4);
call函数可以接受多个参数,第一个参数:使函数内部this指向这个参数,第二、三...后面的是传递的参数,可以在fn函数中可以接收。
apply函数的使用
let name = "张三"; //全局变量
function fn(a, b, c, d) {
console.log(a, b, c, d); // 1 2 3 4
console.log(this.name, "this.name"); //改变了this指向,指向了pointObj /王二
}
let pointObj = { name: "王二" };
fn.apply(pointObj, [1, 2, 3,4]);
apply函数可以接受两个参数,第一个参数:使函数内部this指向这个参数,第二个参数是一个数组,在fn函数中可以接收到数组中传递的参数
bind函数的使用
let name = "张三"; //全局变量
function fn(a, b, c, d) {
console.log(a, b, c, d); // [1, 2], { x: "x1" },'hello','world'
console.log(this.name, "this.name"); //改变了this指向,指向了pointObj /王二
}
let pointObj = { name: "王二" };
fn.bind(pointObj, [1, 2], { x: "x1" }, "hello", "world")();
bind函数可以接受多个参数,第一个参数作用:使函数内部this指向这个参数,第二、三...后面的是传递的参数,可以在fn函数中接收。需要注意:不会立即执行
总结:call、apply、 bind的区别
相同点:都可以改变函数中this的指向
不同点:
1.call、apply函数调用会立即执行,而bind函数不会立即执行。
2.call、bind可以接收多个参数,而apply接收两个参数,第二个参数是数组,需要把传递的参数放入数组中,调用的函数才能接收到,如果传递第三个参数,也不会报错,但是在函数中拿不到