最近也是看了很多方面的知识,前端后端都有,有的现在看起来并不是很理解,才发现有些基础的东西其实是非常重要的,对于我们编写高质量的代码,以及能够及时找出代码中的bug尤为重要,博主也是看到了一个关于call方法的视频,里面讲解的也是非常不错,也因此深入了解了一下,今天和大家分享一下call方法的实现,也是对自己所学的一次巩固。

相信大家也是能够了解call及apply的用法了,这里就是简单提及一下,最重要的作用其实就是改变this的指向,两者之间的区别也就是传参列表不同,call的参数是单独的一个一个传,而apply是传进去一个数组,但是其实解析的时候,也是会将数组的元素抽出来一个一个解析,要注意的是,即使apply只有一个参数,也需要加上[],表示数组形式的参数。上面的说法可能有些难以理解,至少当初对于博主来说,一直没有能理解,后来还是看到了一个博文,觉得上面的解释非常有意思:即我有一个吃的方法,加入某人也想要我的吃的方法,但是他自己没有,那么他怎么办才能获得吃的方法呢,很简答,就是利用call方法。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><script>var person = {name: 'qiugu',eat: function(){console.log('i am eating');}}var personAnother = {name: 'gailun',drink: function(){console.log('i am drinking');}}var result = person.eat.call(personAnother);    //i am eating</script>
</body>
</html>

最后输出的结果就是吃的方法,更通俗的来说,就是有了call方法以后,等于自己拥有了别人的能力,这样一说是不是更能理解了呢。

当然今天主要是来实现一下call方法的,当然其实apply也是一样的原理,这里就是以call方法为例,有兴趣的同学可以试试apply的实现,了解底层的实现方法,才能更好的去运用起来,下面则是实现的过程

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><script>Function.prototype.myCall = function(context){context = context || window;   context.fn = this;    //context指的就是传进去的参数,这里其实就是指的就是调用的对象,即anothervar args = [],result;    //this指的是上下文的环境,这里就是指的eat的方法,即在another对象上创建了eat的方法for(let i = 1;i < arguments.length;i++){args.push(arguments[i]);}result = context.fn(...args);delete context.fn;return result;}var person = {name: 'qiugu',eat: function(){console.log('eating!');}}var another = {name: 'yasuo',drink: function(){console.log('drinking!');}}person.eat.myCall(another);//eating!</script>
</body>
</html>

这个其实就是在Function的原型上面写了一个方法,实际过程就是在指向的对象上面创建了一个同样的方法,然后再将这个方法删掉,之所以有context = context || window这样的写法,其实就是一个防止报错的写法,如果输入的context为空的话,就用window这个全局变量来指代context,当然最后输出的结果也就是undefined了,不过却不会报错,这种写法也是给了博主这样的菜鸟一个很大的榜样,写代码就是要这样,考虑周全,要想好思路,确定好以后再去写,任何值如果不注意的话,后续产生bug,找都很难找出来。希望菜鸟程序员们后期写代码也是要以此为榜样,养成一个良好的习惯比什么都重要。

call的用法及底层实现相关推荐

  1. 20200817-Mysql 底层数据结构及Explain详解

    Mysql 底层数据结构 常见面试题 索引 数据结构 二叉树 B-tree B+tree Hash 存储引擎 MyISAM存储引擎索引实现 非聚集索引 InnoDB存储引擎索引实现 辅助索引 联合索引 ...

  2. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  3. golang 重要知识:channel 用法和底层原理

    前言 channel 是 goroutine 与 goroutine 之间通信的重要桥梁,借助 channel,我们能很轻易的写出一个多协程通信程序.今天,我们就来看看这个 channel 的常用用法 ...

  4. python高级用法技巧-Python高级用法总结

    列表推导(list comprehensions) 场景1:将一个三维列表中所有一维数据为a的元素合并,组成新的二维列表. 最简单的方法:新建列表,遍历原三维列表,判断一维数据是否为a,若为a,则将该 ...

  5. java学习与总结:多线程与并发

    文章目录 进程与线程 创建线程的方式 多线程通信方式 线程开多少数量合适? 线程的安全活跃态 竞态条件 终止线程的四种方式 Java线程的生命周期 CAS i++和++i是否安全?如何实现安全自增 A ...

  6. 个人总结------高级知识点必会

    高级知识点之必会 共44题 1.OC中创建线程的方法是什么?假设指定在主线程中执行代码?怎样延时执行代码.[难度系数★★] 1)创建线程的方法 NSThread NSOperationQueue和NS ...

  7. 运行时异常与一般异常有何异同_Java修行第015天,异常机制和常用类

    1. 异常概念_分类 1) 什么叫异常? 答:异常(Expection)就是在程序运行过程中所发生的不正常的事件,它会中断正在运行的程序 2) 请简述异常的分类? 答:异常分为Error(仅靠程序本身 ...

  8. string插入字符_String类

    String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为"不可变对象". 那什么叫做"不可变对象"呢?指的是对象内部的成员变量 ...

  9. 尚硅谷和尚学堂的区别_在北京尚学堂学习的009天

    1. 冒泡排序的优化算法 (1) 冒泡排序的基础算法有哪些缺点? 冒泡排序的基础算法的缺点:排序的次数多,外层循环是数组的长度-1次,内层循环也需要数组长度-1的次数一样多.效率较低. (2) 可以从 ...

最新文章

  1. oracle 修索引改空间_记一次Oracle分区表全局索引重修的历程
  2. 在vs2005中安装boost库
  3. POJ2195 Going Home 最小费用最大流
  4. PLT redirection through shared object injection into a running process
  5. Ubuntu服务器安装snmpd(用于监控宝)
  6. 2017年网络统考计算机成绩,2017年12月江苏省成人计算机基础统考成绩查询
  7. Java线程池的实现原理,你清楚么?
  8. java supplier_Java 函数式编程
  9. centos安装stress安装失败_Linux压力测试工具Stress的使用指南
  10. 【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 目录
  11. 图解SynchronousQueue原理详解-非公平模式
  12. python怎么放音乐_python怎么添加背景音乐
  13. vc red.msi matlab,vc red.msi x64+x32位版下载
  14. 使用VMWARE(VMware8)安装Mac OSX 雪豹操作系统
  15. 当《流浪地球》冲过2亿:中国的科幻大片为什么来得这么晚?
  16. 将csv文件分割成多个文件
  17. VMware虚拟机不能识别U盘
  18. python canvas画弧度_编程作战丨如何利用python绘制可爱皮卡丘?
  19. 平凉锅盔西北美食的文化的传承之一
  20. 房屋检测中七大类别的适用范围是什么?

热门文章

  1. 论文翻译-语音合成:WaveNet
  2. python 12306登录 2019_Python 实现12306登录功能实例代码
  3. 2020-12-20 数学基础(集合、映射、函数)
  4. 如何在app中打开支付宝进行打赏开发者
  5. Spark编程实战-词频统计
  6. 我有一个计算机梦想作文500,我有一个梦想作文500字(精选3篇)
  7. 【python爬虫】Pycharm+Scrapy+win10搭建scrapy开发环境+运行一个Demo
  8. win32 ShowCursor遇到的问题
  9. 印度理工学院:“印度版麻省理工”的迷思(南方人物周刊)
  10. 计算机三级信息安全技术 | 填空题 3 重点标注版