为什么突然想说bind函数,还是要多亏了上周二的三次面试。说起面试我可能就要多话几句,其实面试也是一个相当消耗体力与脑力的运动。所以面试前睡个好觉,吃顿饱餐,可以说是成功了一半。还有一半可能就要靠你平时的积累与发挥。
在上周的面试中,每次面试官都有提到bind函数,万万没想到,bind函数的出现率居然如此高!
我虽知道bind函数的用法但是并没有细致的去研究和揣摩过bind函数。所以...
虽说技术面中一道题不会致你余死地,但也会降低你在技术领域高大而宏伟的形象,面试官或许会在心中暗想这娃不行。
本文我主要根据面试时候遇到的题目,总结为以下2个问题
1.bind和apply(call)最根本的区别是什么
2.在ES5之前手写实现bind函数
如果小伙伴早知熟知这两个问题,可以浏览下一朋友正在筹划中的 面试汇总库
闲事少管,走路陈展。开始正题。
1.bind和apply(call)最根本的区别是什么
我相信大多数朋友都深刻的知道call,apply是参数列表的不同。但今天重点是说明
bind()方法创建一个新的函数,在调用时设置this关键字为提供的值
apply() 方法调用一个具有给定this值的函数
关键在于bind函数创建了一个新的函数并且这个新的函数执行上下文不会再变
一位码农是一个函数,他的女票就是他的对象
情比金坚,至死不渝的码农 = 码农.bind(对象)
而使用apply,call更像是我今天喜欢你,明天喜欢他,后天隔壁家的王喇叭,但是基本上是单相思对方都不同意,所以都没能产生结果。
2.在ES5之前手写实现bind函数
// 面试中回答的方法,也是mdn文档提供的方法
Function.prototype.bind2 = function (context) {
if (typeof this !== "function") {
throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
}
var self = this;
var args = Array.prototype.slice.call(arguments, 1);
var fNOP = function () {};
var fBound = function () {
var bindArgs = Array.prototype.slice.call(arguments);
return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
}
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
}
如果我的文章对你有帮助,我也希望能够得到你的鼓励,因为你的鼓励是我前进的动力。