用最简单的方式手撕Js中的call & bind

简介: 前言好久没有更新过博客了,最近项目进度比较紧张,每天都在加班,学习的时间少之又少,目前这家公司的技术栈以尤大大的Vue+饿了吗的elementui为主导,项目中很少会用到 call & bind,昨天复习了一下原型链的知识,感觉比之前的理解又深入了一个层次,两大基类(Function & Object)的概念愈发强烈,今天抛开原型链,来说一说,call & bind。

前言

好久没有更新过博客了,最近项目进度比较紧张,每天都在加班,学习的时间少之又少,目前这家公司的技术栈以尤大大的Vue+饿了吗的elementui为主导,项目中很少会用到 call & bind,昨天复习了一下原型链的知识,感觉比之前的理解又深入了一个层次,两大基类(Function & Object)的概念愈发强烈,今天抛开原型链,来说一说,call & bind。


Call

首先我们先来了解一下他分别干了什么事儿:


参数: context params

将 this 指向 context,params传递给当前调用 call 的函数

函数执行

注意:call 的context不穿值或者传递null,都指向window

知道了他做了什么事儿,那么我们实现起来就很简单了:

// 先将我们自己定义的myCall绑定到 Js的内置类 Function的原型上
Function.prototype.myCall = function( context, ...params ) {
  // 校验context是否是undefined || null
  context == null ? context = window : null;
  // 校验如果 context是基本数据类型的话转化成引用 栗子:context = 1; 那么 Object(context) = Number { 1 },此时 typeof context === 'object'
  !/^(object|function)$/.test( typeof context) ? context = Object(context) : null; 
  // 定义形参,除了context是一个以外,后面的参数是不固定的,直接rest运算符一步到位
  let _this = this, // 养成习惯...保留this指向
    result = null, // 接收函数执行的返回结果
    KEY = Symbol('KEY') // 使用Symbol定义 KEY,防止与context原有的属性冲突
  context[KEY] = _this; // 将当前函数挂载到context中
  result = context[KEY](...params); //当前函数作为context中的一个属性的值被调用
  delete context[KEY] // 删除context上自己添加的属性,保持与之前的context一直
  return result // 返回函数执行的结果
}

Bind

知道call方法的原理以后,bind就很简单了,无外乎不立即执行

Function.ptototype.myBind = function( context, ...outParams ) {
  // outerParams主要是形参集合
  let _this = this;
  return function( ...innerParams ) { //innerParams 主要是ev对象
    this.call(context, ...outParams.concat(...innerParams))
  }
}
doucument.body.onclick = fn.myBind(obj, 10, 20);
function fn(x, y, ev) {
  this.x = 3;
  this.y = 4;
}
var obj = {
  x: 1,
  y: 2
}
目录
相关文章
|
3月前
|
前端开发 JavaScript 开发者
揭秘JavaScript魔法三剑客:call、apply、bind,解锁函数新世界,你的前端之路因它们而精彩!
【8月更文挑战第23天】在 JavaScript 的世界里,`call`、`apply` 和 `bind` 这三个方法常常让新手感到困惑。它们都能改变函数执行时的上下文(即 `this` 的指向),但各有特点:`call` 接受一系列参数并直接调用函数;`apply` 则接收一个参数数组,在处理不确定数量的参数时特别有用;而 `bind` 不会立即执行函数,而是创建一个新版本的函数,其 `this` 上下文已被永久绑定。理解这三个方法能帮助开发者更好地运用函数式编程技巧,提升代码灵活性和可维护性。
38 0
|
30天前
|
JavaScript 前端开发
JS高级—call(),apply(),bind()
【10月更文挑战第17天】call()`、`apply()`和`bind()`是 JavaScript 中非常重要的工具,它们为我们提供了灵活控制函数执行和`this`指向的能力。通过合理运用这些方法,可以实现更复杂的编程逻辑和功能,提升代码的质量和可维护性。你在实际开发中可以根据具体需求,选择合适的方法来满足业务需求,并不断探索它们的更多应用场景。
10 1
|
1月前
|
JavaScript 前端开发
js 中call()和apply()
js 中call()和apply()
28 1
|
2月前
|
自然语言处理 JavaScript 前端开发
JS中this的应用场景,再了解下apply、call和bind!
该文章深入探讨了JavaScript中`this`关键字的多种应用场景,并详细解释了`apply`、`call`和`bind`这三个函数方法的使用技巧和差异。
|
2月前
|
JavaScript 前端开发
this指向的几种情况以及js简单实现call、apply、bind___六卿
本文讨论了JavaScript中`this`的指向规则,并提供了`call`、`apply`和`bind`方法的简单实现,用于改变函数的`this`指向。
17 0
this指向的几种情况以及js简单实现call、apply、bind___六卿
|
2月前
|
JavaScript
js的this与call,apply,bind
js的this与call,apply,bind
|
3月前
|
JavaScript 前端开发
js 中call()和apply()
js 中call()和apply()
38 0
|
3月前
|
JavaScript 前端开发
深入浅出 妙用Javascript中apply、call、bind
【8月更文挑战第1天】深入浅出 妙用Javascript中apply、call、bind
28 0
|
4月前
|
JavaScript
js【详解】call()、apply()、bind()方法
js【详解】call()、apply()、bind()方法
40 6
|
5月前
|
JavaScript 前端开发 开发者
【JavaScript】JavaScript中call、apply与bind的区别:进阶特性与应用场景
【JavaScript】JavaScript中call、apply与bind的区别:进阶特性与应用场景
60 0
下一篇
无影云桌面