区别:
1.三者都可以改变函数的this对象指向。
2.三者第一个参数都是this要指向的对象,如果没有这个参数或者参数为undefined或unll那么他会默认指向window。
三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。bind是返回绑定this之后的函数,便于稍后调用;apply、call则是立即执行的。
实现:
Function.prototype.bind2 = function (context) {
// 保存原函数的引用
var self = this;
// 获取bind时传入的参数
var args = Array.prototype.slice.call(arguments, 1);
// 返回一个新函数
return function () {
// 获取新函数执行时传入的参数
var bindArgs = Array.prototype.slice.call(arguments);
// 将原函数的上下文设置为指定对象,同时将参数合并并传入原函数
return self.apply(context, args.concat(bindArgs));
};
};