bind、call、apply 区别?如何实现一个bind?( 二 )

为什么会没有输出呢?上文已经提到了,这就是和bind、call的区别了
bind不会执行bar函数,只是改变了其this指向,并且给它传入了参数,添加一行代码呢?如下:
var foo = { value: 1};function bar(name, age) { console.log(name) console.log(age) console.log(this.value);}bar.bind(foo, 'kevin', 18);bar();// undefined// undefined// undefined对的,你没看错,输出了三个undefined,因为虽然调用了bar(),但this指向了window且没有传入任何参数,理所当然都是undefined了,可见使用了bind后并不会改变原函数,其实call和apply也都不会改变原参数,也就是说call和apply是一次性的,这里为什么我没说bind呢,因为他会返回一个函数,如果我们保存这个函数,它就不是一次性的了,如果再执行这个函数就可以达到我们想要的效果了,注意:执行apply和call时,就如同执行原函数,返回值和原函数相同,如果原函数不返回值,则apply和call也不会返回任何值!
function fn(...args){console.log(this,args);}let obj = {myname:"张三"}const bindFn = fn.bind(obj); // this 也会变成传入的obj ,bind不是立即执行需要执行一次bindFn(1,2) // this指向objfn(1,2) // this指向window小结从上面可以看到,apply、call、bind三者的区别在于:

  • 三者都可以改变函数的this对象指向
  • 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window
  • 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入
  • bind是返回绑定this之后的函数,apply、call 则是立即执行
实现实现bind的步骤,我们可以分解成为三部分:
  • 修改this指向
  • 动态传递参数
// 方式一:只在bind中传递函数参数fn.bind(obj,1,2)()// 方式二:在bind中传递函数参数,也在返回函数中传递参数fn.bind(obj,1)(2)
  • 兼容new关键字
整体实现代码如下:
Function.prototype.myBind = function (context) {// 判断调用对象是否为函数if (typeof this !== "function") {throw new TypeError("Error");}// 获取参数const args = [...arguments].slice(1),fn = this;return function Fn() {// 根据调用方式,传入不同绑定值return fn.apply(this instanceof Fn ? new fn(...arguments) : context, args.concat(...arguments));}}给大家分享我收集整理的各种学习资料,前端小白交学习流程,入门教程等回答-下面是学习资料参考 。

【bind、call、apply 区别?如何实现一个bind?】


推荐阅读