从底层理解this是什么( 四 )

实现bindbind目的也一样 , 改变this , 但是它并不是直接调用函数 , 而是返回 改变了内部this值的函数, 当需要的时候再调用:
咱们来实现一下:
Function.prototype.dellBind = function (context) {// 判断是函数才能调用call方法if (typeof this !== 'function') {return new TypeError("类型错误")}// 用that变量保存被调用的函数const that = this;// 保存传入的参数const argArr = [...arguments];// 返回一个函数 , 这样调用这个被返回的函数 , 内部的that.call()函数才会被执行return function F() {// 用call来实现改变被调用函数内部this指向return that.call(context, [...argArr, ...arguments]);}}咱们来分析一下bind:

  • 其实bind和apply就一点区别 , bind返回一个被改变了内部this指向的函数
  • 当调用返回的函数 , 改变了内部this指向的函数才能运行 , 运行后返回结果
  • 实现来也很容易 , bind返回不再像call那样返回结果 , 而是返回了一个函数 , 调用返回的函数当然才能运行内部被改变了this指向的函数
优化:严格的来说这并不是一个合格的bind , 因为还需要考虑到把函数当作构造函数调用的情况 , 当使用new来把函数作为构造函数调用的时候 , 就不要改变this指向了 , 直接对被调用函数new一下返回就行了
代码如下:
Function.prototype.dellBind = function (context) {// 判断是函数才能调用call方法if (typeof this !== 'function') {return new TypeError("类型错误")}// 用that变量保存被调用的函数const that = this;// 保存传入的参数const argArr = [...arguments];// 返回一个函数return function F() {// 如果用的new , 即用的是构造函数if (this instanceof F) {return new that(...argArr, ...arguments);}// 用call来实现改变被调用函数内部this指向return that.apply(context, [...argArr, ...arguments]);}}分析一下:
  • 通过 instanceof 分析就可以得到 ,this 是不是由 F 通过 new 得到的 ,new 已经讲过啦 ,new 运算内部会更换原型链: A.__proto__ === B.prototype
  • 所以如果F的原型在this的原型链上 , 那么当然是用的 new 当作构造函数调用了 , 咱们也应该 new 该函数返回即可
作者:dellyoung
【从底层理解this是什么】出处:


推荐阅读