如果自己去实现call apply bind,看上去挺复杂,写起来其实就几行代码
因为call和apply一样,只是传参不一样,所以我就只写一个call
实现call(其实只有2行代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const obj = { name: "我是需要被绑定改变this指向的对象" };
function fn(arg) { console.log("fn---------", this); console.log("fn---------", arg); }
Function.prototype.call = function (target, ...args) { console.log(this); target["vhan"] = this; console.log(target); target["vhan"](args); delete target["vhan"]; }; fn.call(obj, "我是大帅哥");
|
实现bind
因为bind的调用方式,是返回一个新函数,在调用一次,例如:fn.bind(null)(options),所以需要用到高阶函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const obj = { name: "我是需要被绑定改变this指向的对象" };
function fn(arg) { console.log("fn---------", this); console.log("fn---------", arg); }
Function.prototype.bind = function (target) { target["vhan"] = this; return (...args) => { target["vhan"](args); delete target["vhan"]; }; }; fn.bind(obj)("我是大帅哥!!!");
|