call()、apply()的意义 :改变函数执行时的上下文,也就是改变this指向;

call和apply的区别:

1. call() 方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数。

2. apply() 方法使用一个指定的this值和单独给出的 一个或多个参数的数组 来调用一个函数。

3. bind() 方法也改变this指向,但会返回一个新的函数,需要再次调用。(下一篇。)

绑定函数.call(指向函数)

Call和apply都是获得绑定函数的this和参数,然后在指向函数的环境中执行,并返回结果

实现call:

在指向函数环境中新建一个属性(绑定函数),然后执行绑定函数,返回结果

function person(a,b,c){return {name:this.name,a,b,c}
}
var egg = {name:'hhhh'}Function.prototype.newcall=function(obj){var obj=obj||window//此处的this指向person函数,//在obj中添加一个属性b,值为person函数obj.b=this//获得除this外的参数var newarguments=[]for(var i=1;i<arguments.length;i++){newarguments.push('arguments['+i+']')}//在obj中执行,则this会指向obj,把person中的参数给obj.b()var result=eval('obj.b('+newarguments+')')delete obj.b//返回参数return result
}
//把person的this指向egg对象
let dd=person.newcall(egg,1,2,3)
console.log(dd)

实现apply:

和call方法的不同在于需要对参数的判断是否有,

Apply:function(obj,arr)

需要判断是否有参数if(!arr),

如果没有直接返回obj.b()

如果有参数,类似于call的方式处理参数

function person(a,b,c){return {name:this.name,a,b,c}
}
let dd={name:'hhhhh'}Function.prototype.newapply=function(obj,arr){var obj=obj||window var resultobj.b=this//判断是否有参数if(!arr){//如果没有直接执行result=obj.b()}else{var newarguments=[]for(let i=0;i<arr.length;i++){newarguments.push('arr['+i+']')}result=eval('obj.b('+newarguments+')')}   delete obj.breturn result
}let ff=person.newapply(dd,[1,2,3])
console.log(ff)

手写call,apply相关推荐

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

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

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

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

  3. 手写call,apply,bind函数

    涉及面试题 call,apply,bind函数内部实现是怎样的? 考虑两点: 第一个参数为undefined或null的时候,那么会转变为window 改变了this执行,让新的对象可以执行该函数. ...

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

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

  5. fortran中call的用法_手写源码系列(一)——call、apply、bind

    什么是手写源码 平时面试时经常会遇到让手写一个已有方法的实现,其实面试官是想考察你对于JS底层逻辑是否熟悉,经常面试会出的会在下面: call.apply.bind promise requireJS ...

  6. 手写 call、apply 及 bind 函数

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

  7. 手写apply、call、bind(大量代码)

    最近又进行了基础知识的重新学习,然后进行了call,apply,bind的this指向.参数类型以及代码的手写,然后整理了下. this指向 // this指向 const phper = {name ...

  8. 理解 call、apply、bind 原理,手写简单的 call、apply、bind 方法

    理解 call.apply.bind 原理,手写简单的 call.apply.bind 方法 call 原理及实现 MDN定义:call()方法使用给定的 this 值和单独提供的参数调用函数. 用自 ...

  9. 全栈AI工程师指南,DIY一个识别手写数字的web应用

    作者 | shadow chi 本文经授权转载自 无界社区mixlab(ID:mix-lab) 网上大量教程都是教如何训练模型, 往往我们只学会了训练模型, 而实际应用的环节是缺失的. def AIF ...

  10. 手写AngularJS脏检查机制

    什么是脏检查 View -> Model 浏览器提供有User Event触发事件的API,例如,click,change等 Model -> View 浏览器没有数据监测API. Ang ...

最新文章

  1. 开始食用grpc(之一)
  2. 好长时间没有到博客园来看看了
  3. hibernate示例_通过示例Hibernate–第1部分(删除孤儿)
  4. android app逆向分析,如何开始对Android应用的逆向分析?
  5. python 指定gpu_加快Python算法的四个方法:Numba篇
  6. java debug详解_Java远程debug详解
  7. 人工智能的发展历史概览
  8. MT7620A路由刷DDWRT
  9. 商务通传递中文及样式
  10. 什么是Redis哨兵机制?
  11. numpy均匀分布_Numpy的基本操作
  12. App推广技术如何帮助App推广
  13. Eclipse修改背景颜色(豆沙绿)
  14. 五金冲压模具设计详细解说!
  15. 下载-MS SQL Server 2005(大全版)含开发人员版、企业版、标准版
  16. node.js+vue.js+mysql实现登录注册的功能(前后端分离)
  17. 关于 ABAP 开发对象的原始语言版本(Original Language)
  18. iOS debug神器
  19. DoozyUI⭐️十八、Scene Management:场景切换助手
  20. linux文件的权限已经是777了但是还是没有写入权限

热门文章

  1. java上下左中右的布局面板_JAVA GUI重要知识点学习心得
  2. matlab 圆锥投影,基于MATLAB的等差分纬线多圆锥投影变换
  3. 基于JAVA+Swing+MYSQL的工资管理系统
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的家庭理财管理系统
  5. 基于JAVA+Servlet+JSP+MYSQL的保险管理系统
  6. 剑指offer:滑动窗口的最大值(栈和队列)
  7. Docker 三剑客之 Docker Compose
  8. 3D Math Primer for Graphics and Game Development -- 图形与游戏开发(3D数学基础) (简介)...
  9. FreeMarker MyEclipse IDE
  10. 优雅数据结构-BloomFilter