目录

写在前面

call手写实现

apply手写实现

bind手写实现


写在前面

今天的主题是手写实现某些常见的js函数。在JavaScript中,我们知道改变一个函数的this指向,一般来说有这样三个函数可以帮助我们做到这样的效果,分别是call、apply、bind。但是三个函数又有所区别,具体的区别我就不详述了,大家可以去call、apply、bind详细介绍看看详细的介绍。

call手写实现

    var age = 16;var gender = 'female';var obj = {age: 11,gender: 'male'}function Test(a, b) {console.log(this.age);console.log(this.gender);comsole.log(a);comsole.log(b);}

我们先来看看js的原生call函数的效果,请看下面代码:

    Test(3, 5);Test.call(obj, 22, 33);

其输出结果如下:

ok,下面我们来自己首先代码实现我们自己的call函数,show you the code:

    Function.prototype.myCall = function (obj, ...args) {obj.fn = this;let res = obj.fn(...args);delete obj.fn;return res;}

同样的,我们来调用我们的myCall函数:

    Test.myCall(obj, 22, 33);

输出如下:

很显然,我们已经实现了call函数的功能,下面我们简单的分析一下实现的原理及思路:首先myCall函数是挂载在Function构造函数的原型上的,这没什么好解释的,大家都懂;其次,我们都知道调用myCall函数的第一个参数为this的指向,所以第一个参数单独写,然后怎样让函数的调用时this指向这个参数呢?这时我们可以利用对象的方法调用时,其方法的his指向此对象,所以我们把原函数当作一个方法挂载在第一个参数obj上,所以我们可以看到 obj.fn = this; 这行代码,此时就实现了改变this的指向,此时最最重要的部分已经被我们解决了,接下来的事情不多说了,水到渠成。

apply手写实现

先来看看apply的调用及调用后的效果:

    Test.apply(obj, [36, 37]);// 输出如下:11"male"3637

下面开始实现我们自己的apply:

    Function.prototype.myApply = function(obj, args) {obj.fn = this;let res;if (args && args.length) {res = obj.fn(...args);} else {res = obj.fn();}delete obj.fn;return res;}

下面调用一下我们自己的myApply函数试试看效果:

    Test.myApply(obj, [55, 56]);// 输出如下:11"male"5556

可以看到,我们自己手写的myApply函数同样是达到了效果,原理同上就不在此赘述了。

bind手写实现

这里,我们直接手写我们自己的bind函数,就不再赘述原生的bind函数了,直接上code:

    Function.prototype.myBind = function(obj, ...args) {obj.fn = this;return function() {const newArgs = args.concat(...arguments);let ret = obj.fn(...newArgs);delete obj.fn;return ret;}}

调用我们自己的myBind函数看看效果:

    Test.myBind(obj, 66, 67)();Test.myBind(obj, 77)(78);// 分别输出如下:11"male"666711"male"7778

JS手写实现call、apply、bind相关推荐

  1. 一文帮你搞定90%的JS手写题

    还在害怕手写题吗,本文可以帮你扩展并巩固自己的JS基础,顺便搞定90%的手写题.在工作中还可以对常用的需求进行手写实现,比如深拷贝.防抖节流等可以直接用于往后的项目中,提高项目开发效率.不说废话了,下 ...

  2. 【面试】970- 一文帮你搞定90%的JS手写题

    还在害怕手写题吗,本文可以帮你扩展并巩固自己的JS基础,顺便搞定90%的手写题.在工作中还可以对常用的需求进行手写实现,比如深拷贝.防抖节流等可以直接用于往后的项目中,提高项目开发效率.不说废话了,下 ...

  3. 用 Node.js 手写一个 DNS 服务器

    DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...

  4. [js] 手写一个trim()的方法

    [js] 手写一个trim()的方法 function trim(str) { if (str[0] === ' ' && str[str.length - 1] === ' ') { ...

  5. 2020年前端面试之JS手写代码题合集

    2020年前端面试之JS手写代码题合集 预计会有上千道题,后续慢慢补! 1.  写一个把字符串大小写切换的方法 function caseConvert(str){return str.replace ...

  6. JS手写上传文件、React手写上传文件

    目录 JS手写 React上传文件 JS手写 <!DOCTYPE html> <html lang="en"><head><meta ch ...

  7. 致敬科比,JS 手写贪吃蛇

    用 JS 手写贪吃蛇,致敬黑曼巴科比,实现功能有: 开始/暂停/继续游戏 简单/一般/困难选择 游戏积分榜 暗黑/紫金模式切换 在本场 Chat 中,会讲到如下内容: Bootstrap 组件使用 页 ...

  8. 手写 call、apply 及 bind 函数

    之前在bind和apply以及call函数使用中详解总结过bind和apply以及call函数的使用,下面手写一下三个函数. 一.首先call函数 Function.prototype.MyCall ...

  9. 2021年的几次面试让我死磕了17道JS手写题!

    1.浅拷贝.深拷贝的实现 浅拷贝 // 1. ...实现 let copy1 = {...{x:1}}// 2. Object.assign实现 let copy2 = Object.assign({ ...

  10. JS手写数组扁平化(flat)方法

    方法介绍 数组扁平化方法 Array.prototype.flat() 也叫数组拍平.数组拉平.数组降维. Array.prototype.flat() 用于将嵌套的数组"拉平", ...

最新文章

  1. 对端边缘云网络计算模式:透明计算、移动边缘计算、雾计算和Cloudlet
  2. Knowledge Point 20180305 数据在计算机中的表示
  3. python twisted教程_Python Twisted系列教程16:Twisted 进程守护
  4. 2021最大看点AI for Science,在哪些领域有斩获?
  5. Java基础-关于session的详细解释
  6. Python--day6
  7. Nginx-基础使用
  8. 怎么创建数据表的实体类和业务类_怎样创建一个网站?
  9. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
  10. WAF(NGINX)中502和504的区别
  11. JS函数表达式的特征和递归
  12. 字符串替换(NYOJ)
  13. 春天不健脾养胃 也要等什么时候
  14. 设计模式分析——迭代器模式(Iterator)
  15. 【MySQL】浅谈MySQL中索引的基本操作以及背后的数据结构
  16. OE链面临区块链生态新机遇
  17. 【教程】超详细通过Shizuku集成XQ_Crystal实现收森林能量
  18. STGCN的源码分析
  19. JavaWeb项目实践
  20. 1.单例模式之饿汉式

热门文章

  1. OJ 2306 Problem C Banana
  2. C语言程序设计——从入门到进阶,C语言程序设计——从入门到进阶-巨同升主编.pdf(3)...
  3. 引用第三方SDK产生依赖冲突
  4. android跳转到rn界面,第五章 RN与Native—由原生页面跳转到Rn页面;在Rn页面调用Android Native组件和Native数据...
  5. 女性三围的检测验证js-------格式 20,30,40
  6. iPhone/iPad各机型如何进入恢复模式 苹果进入恢复模式的方法
  7. NLP系列(8)_用可视化解构BERT,从上亿参数中提取出的6种直观模式
  8. 苹果电脑可以装windows系统吗_苹果电脑MacBook双系统安装好后,如何下载Windows支持组件?...
  9. Confluence 摘要(Excerpt)宏
  10. ubuntu桌面图标不显示问题