改变this指向的方法?call,apply,bind三者区别?自己实现三个方法?

call,apply,bind为改变this指向的方法

共同点:

  第一个参数都为改变this的指针,若第一个参数为null或者undifined,则this指向默认window

区别:

  call:第二个参数开始都是实参,使用该方法自动执行函数

  apply:第二个参数是一个数组格式的参数列表,使用该方法自动执行函数

  bind:第二个参数开始都是实参,该方法使用后返回一个函数,需要自己调用执行

实现call方法:

复制代码
Function.prototype.myCall = function (context) {
  if(context == null){
    context = window;
  }
  context.fn = this;
  const arg = [...arguments].slice(1);
  const result = context.fn(...arg);
  delete context.fn;
  return result;
}    
复制代码

实现apply方法:

复制代码
Function.prototype.myApply = function (context, arr) {
  if(context == null) {
    context = window;
  }
  context.fn = this;
  let result;
  if(arr == null){
    result = context.fn();
  }else {
    result = context.fn(...arr);
  }
  delete context.fn;
  return result;
}
复制代码

实现bind方法:

复制代码
Function.prototype.myBind = function (context) {
  if(context == null){
    context = window;
  }
  const arg = [...arguments].slice(1);
  const _this = this;
  
  return function Fn() {
    if(this instanceof Fn) {
      return _this.call(this, ...arg);
    }
    return _this.call(context, ...arg);
  }
}
复制代码

 

  

posted @   腓腓无忧  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示