bind、call、apply 区别?如何实现一个bind?
如果新函数被调用时使用new关键字,则它会创建一个新对象,并将它作为上下文对象使用,然后将参数传递给原始函数。bind()方法创建一个新的函数,将传入的对象绑定为新函数的this值,并返回一个新函数。如果返回的函数被用作构造函数(使用 new 关键字),则应该创建一个新对象并使用原始函数的原型继承它,然后使用新对象作为上下文对象来调用原始函数,并将其参数传递给原始函数。call()方法调用一个函数
bind()方法创建一个新的函数,将传入的对象绑定为新函数的this值,并返回一个新函数。这个新函数可以在以后的任何时间被调用,并且this值始终指向绑定的对象。
call()方法调用一个函数,并将一个对象作为函数执行时的上下文(this 值),以及一个参数列表传递给函数。
apply()方法也调用一个函数,但是它接受一个数组作为参数,数组中的每个元素将被视为函数的一个参数。第一个参数仍然是函数执行时的上下文。
实现一个bind()方法的基本思路是:
返回一个新的函数,该函数在调用时将传入的对象作为其上下文对象(this 值)。
返回的函数应该接受任意数量的参数,这些参数在调用时应该作为原始函数的参数传递。
如果返回的函数被用作构造函数(使用 new 关键字),则应该创建一个新对象并使用原始函数的原型继承它,然后使用新对象作为上下文对象来调用原始函数,并将其参数传递给原始函数。
如果返回的函数被直接调用,则只需要将参数传递给原始函数。
下面是一个简单的实现:
Function.prototype.myBind = function(context, ...args) {
const fn = this;
return function(...innerArgs) {
if (this instanceof fn) {
return new fn(...args, ...innerArgs);
}
return fn.apply(context, [...args, ...innerArgs]);
}
};
这个myBind()方法接受一个context参数作为上下文对象,并返回一个新函数。新函数会将传入的参数args 与在调用时传递给新函数的参数innerArgs合并,并将它们传递给原始函数。如果新函数被调用时使用new关键字,则它会创建一个新对象,并将它作为上下文对象使用,然后将参数传递给原始函数。否则,它将使用传入的 context对象作为上下文对象来调用原始函数,并将参数传递给它。
更多推荐
所有评论(0)