《JavaScript那些事》--简单实现bind
简单实现bind
bind和apply、call一样,能够改变this的指向,从而改变执行函数的执行上下文。
那么可不可以自己实现下bind的功能呢?
明确bind功能
- 改变this指向
- 返回一个可实现函数
- 接收多个参数转为返回函数的形参
实现前的准备
var obj = {
name: "旺财",
say: function () {
console.log(this.name);
},
};
var foo = {
name: "小白",
};
代码实现
Function.prototype._bind = function () {
let args = Array.from(arguments);
//获取执行上下文
let _this = args.shift();
//获取执行函数
let runFunc = this;
//返回新的执行函数
return function () {
let newArgs = Array.from(arguments);
let resArgs = args.concat(newArgs);
//使用apply进行绑定
return runFunc.apply(_this, resArgs);
};
};
obj.say._bind(foo)();//小白
完整代码
var obj = {
name: "旺财",
say: function () {
console.log(this.name);
},
};
var foo = {
name: "小白",
};
Function.prototype._bind = function () {
let args = Array.from(arguments);
let _this = args.shift();
let runFunc = this;
return function () {
let newArgs = Array.from(arguments);
let resArgs = args.concat(newArgs);
return runFunc.apply(_this, resArgs);
};
};
obj.say._bind(foo)();
一些问题
由于简单实现,所以有很多问题有待解决。
- runFunc的类型没有进行判定
- apply的绑定也能重新进行实现,但此处没有
- 绑定构造函数时会出现绑定失败的问题
离大侠再近一步!