快速理解JavaScript中call和apply原理

S4 Hana SD -信贷管理 - 02 在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。 阅读详情

在了解call()和apply()原理之前,我们必须对this的作用和使用方法有所了解,如果你属性this 的用法,那么请直接往下看。

call方法:

语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

call()和apply()的作用十分相似,只是参数类型上的差别,以适应不同的使用场景。它们都是为了改变函数运行时的 context(上下文)而存在的,再说的直白一点,就是为了改变函数内部 this 的指向。

举例说明

我们有一句很经典的谚语,说的是:龙生龙,凤生凤,老鼠生来会打洞,这从遗传上解释是,动物的某些行为有可能是由一系列基因所调控的,但是,注意,我们偏偏想让龙来打洞呢,该如何去实现?下面将围绕这个话题来解释call()和apply()的原理。

var dragon = {
    name : 'foo'
    // other attribute
}

var mouse = {
    name : 'tom',
    makeHole : function(where){
        console.log(this.name + ' is making a hole in the ' + where)
    }
    // other attribute
}

mouse.makeHole.call(dragon,'hill')

运行上面代码后会在控制台上打印出:

可以看出,我们声明了一个dragon的对象,我们并没有赋予它打洞的功能,但是我们使用call()继承了mouse的方法,就可以做到mouse函数所能做到的事情。

这到底是怎么做到的呢?让我们来看看call()的参数:
第一个是一个对象,这个对象将代替Function类里原本的this对象,我们传入的是this,记住,这个this在makeHole函数里指的是未来将要实例化这个函数的对象(我知道这有些拗口),当声明了dragon的时候,这个this指的就是dragon。除了第一个参数,后面所有的参数都是传给父函数本身使用的参数。

而apply()和call()功能几乎一样,唯一的区别就是apply()第二个参数只能是数组,这个数组将作为参数传给原函数的参数列表arguments。

模拟实现call()函数

call()函数是什么样的原理呢?我们用一个实例来帮助理解。

//创建Dragon
function Dragon(name) {
  this.name = name;
}

//创建一个说话的函数
function say(content) {
  console.log(this.name + ' : ' + content)
}

//模拟原生call函数
Function.prototype.myCall = function(context) {
  context = context || window;

  var args = [];
  context.fn = this;

  for (var i = 1; i < arguments.length; i++) {
    args.push(arguments[i]);
  };

  context.fn(...args);
  delete context.fn;
};

//实例化一个名字为'foo'的龙
var foo = new Dragon('foo')

//让foo说话
say.myCall(foo, 'I can talk!')

上面的代码很容易理解,唯一的困难点在于理解在原型链上的myCall函数
我们来分析实现的步骤:

  1. 做一个多场景适配,当myCall函数没有接收到参数时,context对应的是window对象
  2. 创建一个空数组,用于接收形参。
  3. 绑定this,这里的this代表的就是上下文中的say函数。
  4. for循环将参数添加到args数组,循环从1开始是因为第0位是foo对象,并非我们需要的参数
  5. 执行函数,并将args数组作为rest参数传入,这里是ES6的写法,不熟悉的同学参见阮一峰老师的rest 参数文档
  6. 删除函数

打印结果为:

可以看到,这里我们实现了让一个叫做foo的龙说话!
apply()函数实现方式同样类似,可以修改上述例子实现,主要是在参数一部分做处理。

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题 1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con... 阅读详情

相关推荐

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3026

深度解析 JavaScript 中call方法原理

一丶深度解析 JavaScript 中call方法原理 call 方法是 Function 类原型上的一个公共方法,我们知道所有的函数都是 Function 类的一个实例(对象),当然,call函数本身也是Function类的一个实例。 任何一个函数都可以调用call方法,包括call方法本身。函数调用call方法时,是把函数作为Function的实例也就是对象身份的。 function fn1() {} console.log(Function.prototype.call.__proto__ === F

qq_44410862的博客 2653

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4668

call、apply及bind的实现原理

1. call和apply call 和 apply 的功能相同,都是改变 this 的执行,并立即执行函数。区别在于传参方式不同。 func.call(thisArg, arg1, arg2, ...):第一个参数是 this 指向的对象,其它参数依次传入。 func.apply(thisArg, [argsArray]):第一个参数是 this 指向的对象,第二个参数是数组或类数组。 2. c...

zl13015214442的博客 2431

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 290

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

深度解析 call 和 apply 原理、使用场景及实现

call() 和 apply() call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。 call()和apply()的区别在于,call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组 举个例子: var func = function(arg1, arg2) { ... }; func.call(this, arg1, arg2); // 使用 call,参数列表 func.apply(this...

chern1992的博客 1412

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 983

CALL的原理解析及相关习题

CALL的原理解析 首先来来了解一下如何获取除第一个参数以外其它参数:以下两种方法都是利用ES6的规则 //1.方法一:利用剩余运算符 Function.prototype.call = function call(context, ...params) { context == null ? context = window : null; //params就是除了第一个参数外剩余其它参数组成的数组 } //2.方法二:利用ES6的新方法 Array.form() Function.pro

qq_35895679的博客 998

ThingsBoard 场景联动需求

当初有个兄弟请我帮他实现一个需求,需求如上,很简单,实现完成后我怕他操作不来,又写了这份文档给他,今天把这个文档的场景发出来,大家也可以学习一下思路我把需要模拟设备的指令都总结在下面,连接参数截图讲解如下:温度传感器风扇光照传感器灯。

AldrichEugene 1232

135、转动惯量辨识方法

<think>我们要求根据内容生成≤150字的文章摘要。内容是关于电机控制中转动惯量辨识的方法和工程经验。摘要需简洁概括核心:转动惯量重要性、三种方法(加减速法、正弦扫频、MRAS)、工程注意点(摩擦补偿、采样同步等)、实用建议(组合使用、滤波限幅、安全保护)。字数严格≤150。需要提炼。</think>转动惯量辨识是电机控制的关键,负载变化会导致速度环失稳。工程常用加减速法(简单可靠)、正弦扫频法(高精度)、MRAS在线辨识。实操需补偿摩擦、同步采样、控制激励幅度。建议混合使用,辨识结果需滤波限幅,并设置

2401_88858637的博客 39

详解JS中call、apply、bind函数的实现原理

JavaScript

weixin_38881784的博客 411

超声波传感器(CH101&ch201) - Ⅰ

压电微机械超声换能器(PMUT)和超声波信号处理的可编程片上系统(SoC)集成在一起的传感器

nicole088的专栏 2796

es5如何实现promise_关于JS中一些重要的api实现, 巩固你的原生JS功底

在面试中,常常会遇到一些手写XXX之类的面试题,因此好好总结一下,对于巩固我们的原生js的基础是非常必要的。尽管在网上已经有了非常多的总结文章,但在我看来有一个普遍的问题,那就是把原理性的东西过于复杂化了。如果站在面试官的角度,他的目的是在最短的时间内考察出面试者对于JS语言的理解程度,但是在看了网站的诸多总结文章后我发现其中的代码有很大一部分是做意义不大的操作,比如实现一个简单的防抖,...

weixin_39638086的博客 93

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Array.prototype.slice.call()

Array.prototype.slice.call()下面要接触‘函数柯里化’这个概念,感觉跟题目不符,不会的。题目上的会在柯里化中接触到,至于为什么题目不叫‘函数柯里化’,是考虑到我对这个感念都不是很熟悉。网上找了很多,发现大同小异,没有通俗易懂了话语,我的要求就是‘小白都要能看懂才行’。 概念:把接受多个参数的函数变换成接收一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术(百

火火的专栏 694

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

手撕代码ing

桶排序: 引入include 核心代码: int a[10]= {9,6,3,8,5,2,7,4,1,0}; for(int i=0; i<10; i++) cout<<a[i]<<" “; cout<<endl; sort(a,a+10); #注意这是a+10 for(int i=0; i<10; i++) cout<<a[i]<<” "; return 0; 冒泡排序: 思路:如果是升序,相

Ai_cangcang的博客 228

快速理解JavaScript中apply()和call()的用法和用途

call()和apply()的作用十分相似,只是参数类型上的差别,以适应不同的使用场景。它们都是为了改变函数运行时的 context(上下文)而存在的,再说的直白一点,就是为了改变函数内部this的指向。 恩?什么?我似乎听到你说改变this的指向??那就是说。。。 没错!这样就可以实现继承啦!Exciting! 看下面的代码: 以下代码必须看过《疯狂动物城》才可看懂(逃) function animal(name,food) { this.name = name, thi..

lanlan945的博客 321

深入理解 JavaScript 中的 bind、apply、call:用法与实现

JavaScript 中 bind、apply 和 call 方法都用于改变函数执行时的 this 指向,但各有特点:call 和 apply 会立即执行函数,区别在于参数传递方式;bind 则返回一个新函数,允许延迟执行。这些方法在对象方法借用、参数处理、异步回调等场景中非常实用。本文详细解析了三者的用法差异,并通过手写实现揭示了其底层原理,包括如何处理 this 绑定、参数合并以及构造函数调用等特殊情况。掌握这些方法有助于开发者更灵活地控制函数执行上下文,是深入理解 JavaScript 函数机制的关键

pzhdv的博客 1835

开玩笑的吧,call、apply 和 bind 也能手写出来?

在工作中重复造轮子纯粹是浪费生命,但为了学习而尝试造一些 mini 版的轮子也是非常有意义的,而且全面的模拟常用的轮子还可以加深你对这些轮子的理解。

我是张跑跑 955

前端百题斩【015】——快速手撕call、apply、bind

写该系列文章的初衷是“让每位前端工程师掌握高频知识点,为工作助力”。这是前端百题斩的第15斩,希望朋友们关注公众号“执鸢者”,用知识武装自己的头脑。在百题斩【014】中已经简要概述了cal...

wang_yu_shun的博客 414

[前端笔记017]JavaScript之arguments、call、apply、bind、this总结、解构赋值和JSON

JavaScript之arguments、call、apply、bind、this总结、解构赋值和JSON

记一些学习笔记 353

快速理解JavaScript中的call、apply、bind的方法

在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。call、apply、bind方法的共同点和区别:1. 都是用来改变函数的this对象的指向的;2. 第一个参数都是this要指向的对象,也就是想指定的上下文;3. 都可以利用后续参数传参;call、apply、bind方法的不同点:bind 是返回对应函数...

liuyingv8的博客 274
上一篇: Django CMS教程一:安装
DaGeger
博客等级 码龄9年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值