涉及面试题

call,apply,bind函数内部实现是怎样的?

考虑两点:

  • 第一个参数为undefined或null的时候,那么会转变为window
  • 改变了this执行,让新的对象可以执行该函数。

call

Function.prototype.myCall = function(context) {if (typeof context === "undefined" || context === null) {context = window}//context=context||window  和上面的代码一样context.fn = thisconst args = [...arguments].slice(1)const result = context.fn(...args)delete context.fnreturn result
}

实现分析

  • 首先context为可选参数,如果不传的话默认上下文是window
  • 接下来给content创建一个fn属性,并将值设置为需要调用的函数
  • 因为call可以传入多个参数作为调用函数的参数,所有需要将参数剥离出来
  • 然后调用函数并将对象上的函数删除

apply

apply和call实现类似,不同的就是参数的处理


Function.prototype.myApply = function(context) {if (typeof this !== 'function') {throw new TypeError('Error')}context = context || windowcontext.fn = thislet resultif (arguments[1]) {result = context.fn(...arguments[1])} else {result = context.fn()}delete context.fnreturn result
}

bind

因为bind转换后的函数可以作为构造函数使用,此时this应该指向构造出的实例,而不是bind绑定的第一个参数


Function.prototype.myBind = function(context) {if (typeof this !== 'function') {throw new TypeError('Error')}//返回一个绑定this的函数,这里我们需要保存thisconst _this = thisconst args = [...arguments].slice(1)//返回一个函数return function F() {//因为返回一个函数,我们可以new F()需要判断能当做构造函数吗if (this instanceof F) {return new _this(...args, ...arguments)}return _this.apply(context, args.concat(...arguments))}
}
  • bind返回一个函数,对于函数来说有两种方式调用,一种是直接调用,一种是通过new的方式,我们先来说直接调用的方式
  • 对于直接调用来说,这里选择了apply的方式,但是对于参数需要注意以下情况:因为bind可以实现类似这样的代码 f.bind(obj,1)(2),所以我们需要将两边的参数拼接起来,于是就有了这样的实现args.concat(…arguments)
  • new的方式,我们先判断this,对于new的情况,不会被任何方式改变this,所以对于这种情况我们需要忽略传入的this

手写call,apply,bind函数相关推荐

  1. 手写bind_深入理解 JavaScript 之手写 call, apply, bind 方法

    这是老生常谈的手写了,今天想自己试着实现一下,做个笔记. call 方法 Function.prototype.myCall = function (context) { if (context == ...

  2. JavaScript中的call,apply,bind区别及应用(包含手写call/apply/bind)

    目录 一.使用目的 二.三者分别是如何定义的及区别(摘自MDN) 三.在程序中收获 四.三者的具体应用 四.手写bind,apply,call 今天在读程序题的时候,遇到call,apply,bind ...

  3. 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)

    目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...

  4. LR手写代码常用的函数

    1,变量转参数/赋值 lr_save_string("aaa","param"):将字符串"aaa",另存为param. 2,参数转变量 c ...

  5. 手写数字识别代码函数解读(MATLAB实现)

    1.tf = strcmp(s1,s2) 输入参数可以是字符串数组.字符向量和字符向量元胞数组的任何组合 比较 s1 和 s2,如果二者相同,则返回 1 (true),否则返回 0 (false).如 ...

  6. 手写一切(updating...)

    1.手写ajax基本过程 var xhr; if(window.XMLHttpRequest){//code for IE7+,Firefox,Chrome,Opera,Safarixhr = new ...

  7. 手写 call、apply 及 bind 函数

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

  8. call、apply、bind函数详解

     我们都知道call,apply,bind函数都是为了改变this的指向,那么对于三种函数有什么相同点有什么不太点或者有什么应用呢?下面我们来进行介绍 call与apply函数  在javascrip ...

  9. 手写数字识别系统(python+K-近邻完整代码)

    手写数字图片识别系统的介绍: 由于数字图片是一个 32*32 维的二进制向量,不能直接放到模型中使用,所以: 首先需要先将每一个 3232 维的向量转化为 1(3232)维的向量,即 11024 维数 ...

最新文章

  1. ECMAScript 6 Features 中文版
  2. 强化学习之基于伪计数的探索算法
  3. Linux-/proc目录简介
  4. LOJ:黑暗城堡(最短路)
  5. 阿里宜搭重磅发布专有云版本、精品应用市场,助力政企数字化转型
  6. Qt文档阅读笔记-WebEngine Content Manipulatoin Example
  7. 拓端tecdat|R语言Markowitz马克维茨投资组合理论分析和可视化
  8. android 图片合成pdf文件,教你怎么把多张图片合成一个pdf文件
  9. 即时通讯开发资料分享
  10. 漫画:什么是二分查找?(修订版)
  11. javafx设置图片透明度(饱和度,亮度同理)
  12. JS - 阿里云 OSS 文件下载通用办法(支持跨域)
  13. [C程序设计]输出所有的“水仙花数”。
  14. 分享20个高质量的学习网站!
  15. windows重建linux引导,Linux引导修复 利用Linux重建Windows引导
  16. java版我的世界hypixel_我的世界Hypixel服务器
  17. leetcode刷题之旅-58. 最后一个单词的长度
  18. 户籍不在本市并已申请基本养老保险或基本医疗保险关系转移手续销户提取业务办理指南(试行)...
  19. 怎么使用局域网传输文件
  20. 公务员 教师 医生超级福利——网络课程在线挂机

热门文章

  1. 证明DES解密算法实际上是DES加密算法的逆
  2. C++变量的引用是否占用内存空间
  3. 算法C++ DepthFirstSearch BreadthFirstSearch代码模式示范实现(第四章)
  4. 安卓虚拟键盘_Logitech罗技 key to go蓝牙键盘使用体验
  5. qq影音hd+android,QQ影音HD音乐播放器
  6. 风机性能测试的软件设计,风机性能测试系统
  7. New type of dark energy could solve Universe expansion mystery
  8. Error in created hook: “SyntaxError: Unexpected token u in JSON at position 0“
  9. 最近有股强烈的挫败感
  10. 使用docx4j 实现word转pdf(linux乱码处理)