今天面试被问了个
bind
函数实现问题,实现功能如下(可能是为了一些不能使用原生bind
函数的场景,具体的支持情况可以到can i use查看):
// 实现mybind函数,输出'wang~'
var Cat = {
say: function() {
console.log(this.content);
},
content: 'miao~'
};
var Dog = { content: 'wang~' };
Cat.say.mybind(Dog)();
Function.prototype.mybind = function(obj) {
this = obj;
}
开始的想法本来是直接赋值this
指向(面试前在干其他的事,有点短路):
Function.porotype.mybind = function(obj) {
this = obj
}
很显然是行不通的,报错了~~~this
不能作为左侧变量被赋值:
Uncaught ReferenceError: Invalid left-hand side in assignment
面试官提示可以借助call
和apply
函数进行实现,我的实现方法变成了下面的东西(因为this
的显示绑定只能通过call
apply
bind
函数):
Function.prototype.mybind = function(obj) {
return (...args) => this.apply(obj, args)
}
成功~~~,当然如果不使用箭头函数
和...运算符
,也可以换其他方式实现,也都不难