美文网首页
js的this与call,apply,bind

js的this与call,apply,bind

作者: Astep | 来源:发表于2022-01-12 15:56 被阅读0次

谈谈你对this的了解及应用场景?

this绑定方式(共4种方式):默认绑定、隐式绑定、硬绑定(call,apply,bind)、new绑定

this的五种情况分析
this执行主体,谁把它执行的「和在哪创建&在哪执行都没有必然的关系」

  1. 函数执行,看方法前面是否有“点”,没有“点”,this是window「严格模式下是undefined」,有“点”,“点”前面是谁this就是谁
  2. 给当前元素的某个事件行为绑定方法,当事件行为触发,方法中的this是当前元素本身「排除attachEvent」
  3. 构造函数体中的this是当前类的实例
  4. 箭头函数中没有执行主体,所用到的this都是其所处上下文中的this
  5. 可以基于Function.prototype上的call/apply/bind去改变this指向
  6. 手撕call/bind/apply源码

手撕call 原理:就是利用 “点”定this机制,context.xxx=self “obj.xxx=function ” => obj.xxx()

Function.prototype._call = function (context, ...params) {
        if (typeof context === "function") {
          throw new TypeError('参数类型错误');
          return;
        }
        let key = Symbol('fun');
        context = context || window;
        context[key] = this;
        context[key](...params);
        delete context[key];
      };

手撕bind (把function执行并且改变this即可 args->是执行proxy的时候可能传递的值)

Function.prototype._bind = function (context, ...params) {
        if (typeof context === "function") {
          throw new TypeError('参数类型错误');
          return;
        }
        let self = this;
        context = context || window;
        return function (...arg) {
          let key = Symbol('fun');
          context[key] = self;
          context[key](...[...params, ...arg]);
          delete context[key];
        };
      };

手撕apply

Function.prototype._apply = function (context, params) {
        if (typeof context === "function") {
          throw new TypeError('参数类型错误');
          return;
        }
        let key = Symbol('fun');
        context = context || window;
        context[key] = this;
        context[key](...params);
        delete context[key];
      };

相关文章

网友评论

      本文标题:js的this与call,apply,bind

      本文链接:https://www.haomeiwen.com/subject/buubcrtx.html