call、apply、bind其实很简单
2020-09-29 本文已影响0人
郁南
使用过程
var name = "小王",
age = 17,
from = "广州";
var obj = {
name: "小张",
age: 20,
from: from,
fn: function (s1, s2) {
return console.log(
"姓名:" +
this.name +
",年龄:" +
this.age +
",来自:" +
s1 +
",去往:" +
s2
);
},
};
// 这里是obj直接调用,所以this指向是obj
// obj.fn(); // 姓名:小张,年龄:20,来自:undefined,去往:undefined
var obj2 = {
name: "小米",
age: 12,
from: "深圳",
};
// obj.fn.call(obj2); // 重新指向this为第一个参数的调用
// obj.fn.apply(obj2); // 重新指向this为第一个参数的调用
// obj.fn.bind(obj2)(); // 重新指向this为第一个参数的调用,但是因为返回新函数,所以需要自执行
// 姓名:小米,年龄:12,来自:undefined,去往:undefined
// obj.fn.call(obj2, "广州", "深圳"); // 重新指向this为第一个参数的调用,如有参数,顺序填充进去
// obj.fn.apply(obj2, ["广州", "深圳"]); // 重新指向this为第一个参数的调用,如有参数,数组形式填充进去
obj.fn.bind(obj2, "广州", "深圳")(); // 重新指向this为第一个参数的调用,但是因为返回新函数,所以需要自执行,如有参数,和call一样顺序填充进去
// 姓名:小米,年龄:12,来自:广州,去往:深圳
总结
-
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象。
-
call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )。
-
apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])。
-
bind 除了返回是函数以外,它 的参数和 call 一样。