关于javascript中apply()和call()方法的区别

HTB Attacking GraphQL Skills Assessment 通过枚举应用,利用GraphQL API,发现sql注入点,然后利用找到flag。 阅读详情

如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip

好,言归正传,先理解JavaScrtipt动态变换运行时上下文特性,这种特性主要就体现在apply, call两个方法的运用上.

区分apply,call就一句话,

  foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)

 

call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同.

相同点:两个方法产生的作用是完全一样的

不同点:方法传递的参数不同

那什么是方法产生的作用,方法传递的参数是什么呢?

我们就上面的foo.call(this, arg1, arg2, arg3)展开分析.

foo是一个方法,this是方法执行时上下文相关对象,arg1, arg2, arg3是传给foo方法的参数.这里所谓的方法执行时上下文相关对象, 如果有面向对象的编程基础,那很好理解,就是在类实例化后对象中的this.

在JavaScript中,代码总是有一个上下文对象,代码处理该对象之内. 上下文对象是通过this变量来体现的, 这个this变量永远指向当前代码所处的对象中.

为了更好的领会这this是什么,举个例子.  

  代码

 

  题外话:javascript对象所有属性都是公开的(public),没私有(private)之说,所以也可直接访问message属性

 

alert(a.message);

可见,A, B类都有一个message属性(面向对象中所说的成员),A有获取消息的getMessage方法,B有设置消息的setMessage方法,下面来显示call的威力.

  //创建一个B类实例对象

var  b  =   new  B();
// 给对象a动态指派b的setMessage方法,注意,a本身是没有这方法的!
b.setMessage.call(a,  " a的消息 " );
// 下面将显示"a的消息"
alert(a.getMessage());
// 给对象b动态指派a的getMessage方法,注意,b本身也是没有这方法的!

 

 这就是动态语言 JavaScript call的威力所在!

简直是”无中生有”,对象的方法可以任意指派,而对象本身一直都是没有这方法的,注意是指派,通俗点就是,方法是借给另一个对象的调用去完成任务,原理上是方法执行时上下文对象改变了.

所以 b.setMessage.call(a, “a的消息”); 就等于用a作执行时上下文对象调用b对象的setMessage方法,而这过程中与b一点关系都没有, 作用等效于a.setMessage( “a的消息”);

因为apply与call产生的作用是一样的,可以说

call, apply作用就是借用别人的方法来调用,就像调用自己的一样.

好,理解了call, apply相同处—–作用后,再来看看它们的区别,看过上面例子,相信您大概知道了.

从 b.setMessage.call(a, “a的消息”) 等效于 a.setMessage( “a的消息”) 可以看出, “a的消息”在call中作为一个参数传递,

那么在apply中是怎么表示的呢,直接解释说不清楚,apply要结合应用场景才一目了然.我们来设计一个应用场景:
 

01 function print(a, b, c, d){
02 alert(a + b + c + d);
03 }
04 function example(a, b , c , d){
05 //用call方式借用print,参数显式打散传递
06 print.call(this, a, b, c, d);
07 //用apply方式借用print, 参数作为一个数组传递,
08 //这里直接用JavaScript方法内本身有的arguments数组
09 print.apply(this, arguments);
10 //或者封装成数组
11 print.apply(this, [a, b, c, d]);
12 }
13 //下面将显示”背光脚本”
14 example(”背” , “光” , “脚”, “本”);

在这场景中, example方法内,a, b, c, d作为方法传递的参数, 方法分别运用了apply, call去借print方法来调用,

最后一句由于直接调用example方法, 所以在该方法中的上下文对象this就是window对象.

所以,call, apply方法它们除了第一个参数,即执行时上下文对象相同外,call方法的其它参数将依次传递给借用的方法作参数,而apply就两个参数,第二个参数为一个数组传递.所以可以说成

call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.

 

应用场景:

当参数明确时可用call, 当参数不明确时可用apply给合arguments
 

1 //例
2 print.call(window, “背” , “光” , “脚”, “本”);
3 //foo参数可能为多个
4 function foo(){
5 print.apply(window, arguments);
6 }
 
【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本 废品回收小程序是一款基于移动端的应用程序,它提供了废品分类、预约回收、积分兑换等多种功能,帮助用户更方便地进行废品回收,同时还能兑换到一些小礼品或优惠券,让回收变得更加有趣和有价值。随着环保意识的逐渐提高,废品回收成为了我们日常生活中的重要一环。但是,如何更方便、高效地进行废品回收呢?今天,我要向大家推荐一款超级实用的工具——废品回收小程序!废品回收小程序不仅让我们的生活更加便捷,还让我们为环保事业贡献了一份力量。让我们一起行动起来,用废品回收小程序为我们的家园添一抹绿色吧! 阅读详情

相关推荐

Multisim 11.0的安装破解汉化步骤

15:打开注册机,选择管理员运行,默认第一项,选择生成文件路径,这里不要随意选择,要找到你安装Multisim安装路径下Shard下的License Manager路径下,否则会报错,破解失败。14:后面会出现一个更新提示,选择否,然后选择重启电脑后,先不要选择重启电脑,在这里出现了问题(可能敲击回车,默认去重启电脑了),所以我说不要重启电脑,重启破解时右下角出现这,点击否。17:重启电脑,如果前面重启过,那可以跳过重启,应用程序下找到下图所示,启动。16:点击确认覆盖,路径下生成了该文件。

qq_53260940的博客 2373

理清apply(),call()的区别和关系

ref:http://www.popo4j.com/article/the-differences-of-apply-and-call.html如果没接触过动态语言 ,以编译型语言的思维方式去理解javaScript 将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip 慢慢融化以前一套凝固的编程意识

Purpletaro的专栏 964

SPEI计算避坑指南:gma中Distribution和FitMethod参数怎么选?

本文深入探讨了在SPEI计算中如何科学选择gma库中的Distribution和FitMethod参数,帮助研究者避开常见陷阱。详细分析了LogLogistic、Gamma和Pearson3三种分布的适用场景,以及LMoment与MLE拟合方法的优缺点,为气象干旱研究提供实用指南。

weixin_30308101的博客 250

call 和 apply 和有什么不一样?

使用 Function.prototype.apply() 和 Function.prototype.call() 调用函数有什么区别?func.apply(); 与 func.call();上述两种方法之间是否存在性能差异?什么时候最好使用 call 而不是 apply,反之亦然?

HuntsBot的博客 353

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1383

(一)PyBullet机器人仿真入门:从环境搭建到实例解析

本文详细介绍了PyBullet机器人仿真平台从零开始的完整入门指南。内容涵盖环境搭建、官方示例解析、核心操作(连接、世界与模型)、关节控制与状态读取,以及碰撞检测、传感器模拟等高级功能,帮助读者快速掌握这一强大的机器人仿真工具。

weixin_29062865的博客 1382

prototype-apply and call

apply and call   它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别:    apply(thisArg,argArray);    call(thisArg[,arg1,arg2…] ]);即所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的apply的说明如果 argArray

good_youth的专栏 632

Android应用隐私合规自动化检测:Frida与Camille实战指南

在移动应用安全与隐私合规领域,动态代码插桩技术已成为核心检测手段。其原理是通过运行时注入,实时监控和修改应用行为,从而绕过传统静态分析的局限。这项技术的核心价值在于能够精准捕获应用在运行时的敏感数据调用与网络传输行为,为隐私合规审计、安全测试提供直接证据。在实际应用场景中,它尤其适用于自动化检测违规收集个人信息、追踪数据流向等任务。本文聚焦于利用Frida这一动态插桩框架,结合Camille隐私合规检测工具集,构建自动化监控环境。通过注入JavaScript代码,实现对Android敏感API(如获取设备标

weixin_34254464的博客 388

return function (){ return fn.apply(me,arguments)}用法

   研究插件代码发现了一段代码,如下:_bind = function(fn, me){ return function(){ return fn.apply(me, arguments); };  } (apply作用自行百度)当时觉得很纳闷,为什么不这样写 _bind = function(fn, me){  return fn.apply(me, arguments);   } 后来研究了...

qq_38883418的博客 1955

Rk3568 百兆以太网RMII模式DTS配置详解

本文详细解析了RK3568芯片在百兆以太网RMII模式下的DTS配置方法,包括时钟树配置、PHY接口模式定义及实际工程中的进阶设置。通过实战案例和调试技巧,帮助开发者快速解决RMII模式下的常见问题,提升工业控制设备的网络稳定性。

weixin_29189377的博客 422

SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网

文章目录一.简要介绍1.node file2.edge file3.lane definitions(1)路段细分(2)邻近的对向车道(3)删除边或车道4.type file(1)简要概述(2)edge定义中引用type文件的示例(3)指定车辆种类的速度限制5.connections file(1)简要概述:(2)connection的属性参数(3)删除连接(4)设置连接的优先级(5)同一边的多个连接二.演示示例:1.自定义编写node file2.自定义编写edge file3.自定义编写type fil

weixin_50632459的博客 5017

JavaScript中call()、apply()和bind()方法的详细用法与区别

JavaScript中call()、apply()和bind()方法的详细用法与区别

2301_80270696的博客 1739

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5748

JavaScript 中 apply() 和 call() 方法的区别

构成函数主体的JavaScript 代码在定义之时并不会执行, 只有调用该函数时, 他们才会执行。有四种方法来调用JavaScript 函数: 作为函数 作为方法 作为构造函数 通过他们的 call() 和 apply()方法间接调用 在这里简单总结一下 call() 和 apply() 方法的应用。 描述 apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.app...

许建桐的技术博客 243

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【js】javascript中call()和apply()方法的区别

如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip 好,言归正传,先理解JavaScrtipt动态变换运行时上下文特性,这种特性主

PHP在线开发笔记 1737

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

js中call()和apply()方法的区别和用法详解

转需收藏,讲解的很清晰,转载分享给有需要的小伙伴。本文转载自“幽小鬼”的js中call()和apply()方法的区别和用法详解 ——————————————分割线———————————————— 今天又碰到了JacvaScript中的call()和apply()方法,然后看看学学,敲了遍代码,才大概对这两个方法有些了解,这篇博客是对这两个方法的归纳整...

Bonjourjw的博客 537

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【JS】call()、apply()、bind()方法区别及原生代码实现

在上一篇文章 this指向 中,我们已经知道了this的显示绑定方法(call,apply,bind)。现在,我们来看一下这几种方法的区别以及如何使用原生代码实现这些方法的功能吧。 区别 call(),apply(),bind()都能用于改变this指向。 (1)call()与apply()的区别: call:用法为.call(obj,arg1,arg2,…),call的第一个参数绑定this,其余的参数是传递给调用call方法的函数的参数。 apply:用法为.apply(obj,[arg1,ar

星河梦~的博客 782

【js理解】call(),apply()以及bind()方法之间的共同点以及区别

call(),apply()以及bind()方法之间的共同点以及区别

weixin_43872912的博客 292

JS中的call()和apply()方法和区别

一、方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。 call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。 上面的定义看一遍是很懵的,不过自己遍写例子遍反复读的时候,会有种拨开云雾的感觉。 call 与 ...

weixin_42321292的博客 3万+

JavaScript call()和apply()方法区别

call()和apply() 1.共同点:作用完全一样。 都用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。          即在调用方法是,修改当前方法的调用对象 2.不同点:传入参数的形式:          xxx.call(obj,arg1,arg2,arg3)          xxx.apply(obg,[ar

q_qiong的博客 335

js的面试笔试--javascript中call()、apply()、bind()方法的区别

在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这三个方法,来改变函数体内部 this 的指向,因为函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念. call、apply、bind方法的共同点和区别: apply ...

evior 687

javascript中的call(),apply(),bind()方法的区别

之前一直迷惑,记不住call(),apply(),bind()的区别。不知道如何使用,一直处于懵懂的状态。直到有一天面试被问到了这三个方法的区别,所以觉得很有必要总结一下。 如果有不全面的地方,后续再进行补充。 1. 改变this的指向 var obj = { name : '张三', age : 17, myFun : function () { ...

xiaoxiaoyoumeng的博客 275

js的call() ,apply() 两种方法的区别和用法

js的call() ,apply() 两种方法的区别和用法,最白话文的解释,让枯燥滚粗!

Decennie的博客 168
上一篇: JavaScript charAt() 方法
下一篇: 创建对象与括号之间的关系
ios0213
博客等级 码龄15年 5粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值