什么是bind
bind是函数的一种方法; bind()方法会创建一个新函数。当这个新函数被调用时,bind()的第一个参数将作为它运行时的this,之后的参数会当做新函数的实参传入。
举实例说明
function fn(){
console.log([...arguments]);
console.log(this);
}
var obj = {
a:123,
b:321
}
var f = fn.bind(obj,6,6,6);
<!--console.log(f);-->
<!--console.log(f===fn);-->
f();
执行结果:

f执行 让 fn执行; 并且把 6,6,6,6传给fn;fn中的this 指向是 obj;把 6,6,6,6 理解成 f 的默认参数;再给f传递参数的时候;会把传递的参数补在 默认参数的后边
新函数f和fn虽然长得一样,但是他们是不同的地址,所有console.log(f===fn)结果为false;
bind 用法跟call 一样; bind的返回值是一个新函数;新函数执行时 函数Fn才会执行,并且才会修改Fn的this指向, 新函数执行时也可以传入参数,不传参就默认bind执行时候的参数
自己实现bind
根据bind原生特点:
- 返回新函数
- 新函数执行可传入参数
一、返回一个新函数
Function.prototype.myBind1 = function(context){
var that = this;
return function(){
return that.apply(context);
}
}
var f2 = fn.myBind2(obj);
f2();
返回一个函数,并且新函数有返回值,利用apply来修改this指向
二、返回的函数可以传入参数
Function.prototype.myBind2 = function (context,..arg){
var that = this;
return function(..ary){
return that.apply(context,arg.concat(ary);
}
}
var f3 = fn.myBind2(obj,4,5,6);
f3(6,6,6);
三、构造函数
如果用new 的方式来执行新函数,默认的this会失效
function fn() {
console.log([...arguments]);
console.log(this);
}
var obj = {
a: 123,
b: 321
}
Function.prototype.myBind = function (context, ...arg) {
const that = this;
arg = arg || [];
return function f(...ary) {
if (this instanceof f) {
return new that(...arg, ...ary);
}
return that.apply(context, [...arg, ...ary]);
}
}
var f = fn.myBind(obj,1,2,3,4);
var ff = new f(6,6,6);
// console.log(ff===f);