javascript 函数的方法call()和apply() 转

 

call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值。

call()的剩余参数是传递给要调用的函数的值。

结构如下:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

看完下面原作者列出的代码可以解释如下,call()方法就是要用thisObj里的属性或参数,调用call()方法前面的那个对象(函数)的方法

说的通俗一些就是

call()方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

function add(a,b)
{
    alert(a+b);
}
function sub(a,b)
{
    alert(a-b);
}

add.call(sub,3,1);

即add代替sub来接受3和1这两个参数,其等同于add(3,1)

更为复杂些的代码反而更容易理解,让我们看一下这个东西是怎么运行的吧

function Class1()
{
    this.name = "class1";

    this.showNam = function()
    {
        alert(this.name);
    }
}

function Class2()
{
    this.name = "class2";
}

var c1 = new Class1();
var c2 = new Class2();

c1.showNam.call(c2);

call 的意思是把 c1 的方法放到c2上执行,原来c2是没有showNam() 方法,现在是把c1 的showNam()方法放到 c2 上来执行,所以this.name 应该是 class2,执行的结果就是 :alert(”class2″);

我倒感觉这句可以这么理解一下,c1执行showName方法,只不过其中的this被对象c2给代替了

call()还可以实现继承,继续看原贴的代码,

function Class1()
{
    this.showTxt = function(txt)
    {
        alert(txt);
    }
}

function Class2()
{
    Class1.call(this);
}

var c2 = new Class2();

c2.showTxt("cc");

Class2里面调用了Class1的call()方法,这里的this已经是c2了。那么就相当于c1.showText.call(c2,’cc’);和上面解释相同,不重复了。

call()还可以实现多继承,呵。由于原作者这里没有把代码补全,我就给修补一下,也方便自己理解

function Class10()
{
    this.showSub = function(a,b)
    {
        alert(a-b);
    }
}

function Class11()
{
    this.showAdd = function(a,b)
    {
        alert(a+b);
    }
}


function Class2()
{
    Class10.call(this);
    Class11.call(this);
}

var c2 = new Class2();

c2.showAdd(1,2);

c2.showSub(2,1);

两个call()方法就实现了多重继承。呵。

apply()方法与call()方法完全一样,只是apply()方法后面要调用的参数要以数组形式给出即:[0,1]这样。

《JavaScript语言精粹》书中对 apply 方法有着更好理解的概括,现摘录如下:

因为 JavaScript 是一门函数式的面向对象编程语言,所以函数可以拥有方法(函数也是对象,当然可以有方法)。

apply 方法让我们构建一个参数数组并用其去调用函数。它也允许我们选择 this 的值。

apply 方法接收两个参数。第一个是将被绑定给 this 的值。第二个就是参数数组。

新手必看:5分钟搞懂FFT波束形成的底层原理(从阵列信号到频域处理) 本文深入浅出地解析了FFT波束形成的底层原理,从阵列信号采集到频域处理的全过程。通过音乐节场景类比和Python代码示例,帮助新手快速理解多目标波束形成的核心技术,包括频域转换、相位补偿和性能优化策略,适用于雷达、声呐和5G通信等领域。 阅读详情

相关推荐

5款免费二进制编辑器横向评测:从HxD到ImHex谁更适合你?

本文对5款免费二进制编辑软件进行深度横向评测,包括HxD、wxHexEditor、010 Editor、ImHex和GNU Emacs,涵盖从轻量级到专业级的各种需求。评测基于文件处理能力、编辑功能、分析工具等核心维度,为开发者、逆向工程师和安全研究人员提供实用选择指南,帮助用户根据具体场景选择最适合的二进制编辑工具。

weixin_29278805的博客 372

什么是 call 函数? call 函数的用法? call 函数的实现原理(实例演示)

Ⅰ、call 函数的简介: 1、call 函数的用法: fn.call(obj,1,2); A、call() 函数中的第一个参数表示:想让 this 指向的对象 (obj); B、call() 函数中的第二及以后参数表示:传进去的实参; 2、call 函数的功能: 其一、让函数立执行; 其二、可改变 this 的指向; 其三、可实现继承问题; Ⅱ、call 函数如何调用: 1、call() 函数的调用过程: var obj = { a: 1 }; function fn(x, y) { // 每个

狮子座的男孩 1万+

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 271

call ,apply和bind方法 详解

JavaScript 函数call、apply和bind的区别和用法详解

3万+

道岔故障监测系统设计(源码+开题)

通过实时监控道岔的工作状态,系统能够及时发现异常情况,预防潜在的安全隐患,从而减少事故发生的概率。此外,监测系统还能够为维护人员提供详细的数据支持,帮助他们更准确地判断道岔的磨损程度和故障类型,优化维修计划,延长道岔的使用寿命。随着智能化、自动化技术的发展,道岔故障监测系统的设计与应用也将推动铁路行业的技术进步,为实现智能铁路和未来交通系统的构建奠定基础。因此,开展道岔故障监测系统的设计研究,不仅具有重要的工程实践价值,也有助于推动铁路运输行业向更高水平的发展。

灵军程序设计 771

手把手教你用vLLM在昇腾910B上部署Qwen3-Embedding-8B模型(保姆级避坑指南)

本文详细介绍了如何在昇腾910B芯片上使用vLLM推理引擎部署Qwen3-Embedding-8B模型的全流程,包括环境准备、vLLM-ascend定制化安装、模型获取与校验、环境变量配置、服务启动参数优化、性能压测及生产级部署建议。特别针对昇腾生态的开发者,提供了保姆级的避坑指南和实用技巧,帮助实现高效稳定的模型部署。

weixin_28726671的博客 466

Js Call方法详解(js 的继承)

call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象。 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项。将被用作当前对象的对象。 arg1, arg2, , argN 可选项。将被传递方法参数序列。 说明 call 方法可以用来代替另一个对象调用一个方...

hcmfys2009的专栏 717

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3516

js中call()方法的用法

1.call方法 语法:call(thisobj,[argq,arg2]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 说明: call方法可以用来代替一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始化改为新的对象,也就是括号里面的原本的对象改为call()前面的对象、即用thisobj代替call前面的东西,最终用thisobj这个对象去执行call前面的方...

qq_35810838的博客 3万+

Agentic AI商业化落地指南:提示工程架构师的7步优化法

Agentic AI(具备自主感知、决策与行动能力的智能体系统)是未来AI商业化的核心方向,其价值在于将大模型的“认知能力”转化为“实际行动”,解决复杂商业场景中的自动化与个性化需求。而提示工程(Prompt Engineering)作为连接人类意图与智能体行为的“翻译器”,直接决定了智能体的可控性、效率与用户体验,是Agentic AI商业化落地的关键支撑。本文结合第一性原理与工程实践,提出提示工程架构师的“7步优化法”,覆盖从“商业目标定义”到“规模化推广”的全流程。通过理论框架推导架构设计拆解。

AI架构全栈开发实战笔记 1万+

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

函数和call详解

函数定义必须放在函数调用的前面,否则找不到标识符.例如:有时候代码很多,有互相调用,我们很难确保谁在前面谁在后面.例如call1调用call2 , call2又调用call1这时候是会报错的.怎么解决这个问题呢?就涉及到了函数的声明和定义这个时候我们就需要函数声明和函数定义分开的方法,这样就可以了.把函数第一句拷贝出来 加个;即可函数声明, 不带大括号 无函数体,也叫函数原型函数定义 ,带大括号 有函数体,也叫函数实现.一般函数声明放到头文件里,函数定义放到cpp里。

任鸟飞2217777779的博客 4418

Android15车载系统开机冷启动流程源码解析

本文主要介绍Android15车机系统开机冷启动的流程,暂不包含bootloader,仅从kernel开始直至Launcher首页展示。

jidapenglin28的专栏 254

实现 JS 中的 bind、call、apply 方法

目录bind、call、apply 的异同点实现 bind 方法类数组对象转为数组普通函数中的 this 指向eval 和 new Function()实现 call 方法实现 apply 方法 bind、call、apply 的异同点 相同点:这三个方法都是 Function.prototype 上的方法,所有的函数实例都可以使用。它们的作用是相同的,都可以改变函数中的 this 指向,实现方...

alphabet_007 426

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

2301_80270696的博客 1739

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JS中的call()方法和apply()方法用法总结

JacvaScript中的call()方法和apply()方法, 1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。 2. 相同点:这两个方法的作用是一样的。都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

Hei, Welcome To vickie's Blog,Good Good Study, Day Day Up ~ 18万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JavaScript中apply()和call()的区别和应用

JavaScript中的每一个Function对象都有一个apply()方法和一个call()方法,这两个方法能够改变函数体内部 this 的指向。 例如,fun1.call()或者fun1.apply() 都是为了改变fun1函数内部的this指向。 二者的作用完全一样,只是接受参数的方式不太一样。 func.apply(thisArg, [argsArray]) func.call...

qq_32614411的博客 1669

Js函数Function类型以及apply()和call()

文章内容是读“JavaScript高级程序设计”的笔记。 函数其实也是一个对象,每个函数都是Function类型的一个实例,与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名称实际上是一个指向函数的指针。 一、定义函数的几种方式:例如我们以返回两个数值的和为例。 函数声明:这种方式定义的函数的作用域是全局的。 function sum (num1, num2) { ...

xyh的博客 1870

【JavaScript】call()方法和apply()方法用法总结

什么是call()和apply(): 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。 1.apply与call是更改对象的内部指针,即改变对象的this指向的内容; 2.call与apply的第一个参数都是要传入给当前对象的对象,及函数内部的this,后面的参数都是传递给当前对象的参数。 call(): 语法:obj1.call(obj2[,param1,param2,...

Dream_Lee的博客 1354

浅谈JS中call()和apply()的区别和用途?

在JavaScript中,this指向问题一直是一个老生常谈的问题。很多小伙伴应该都知道在js中,this指向哪里通常是在函数调用的时候才确定的,简单来说就是谁调用了函数则this指向谁,当然,这只是狭义的,更加详细的介绍大家可以去看《你不知道的Javascript》这本书。call()和apply()这两个方法的作用可以简单归纳为改变this指向,从而让我们的this指向不在是谁调用了函数就指向谁。

u010227042的博客 1859

js函数对象的call()方法、apply()方法、arguments属性

一、call()方法 call()方法是函数原型对象属性的方法,调用者为函数对象 可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this,从第二个参数起依次传入实参 例:call(obj, a, b);第一个参数表示函数中的this,a,b表示实参 二、apply()方法 apply()方法是函数原型对象属性的方法,调用者为函数对象 可以将一个对象指定为第一个参数,此...

Luck_ZZ的博客 2029

[js] 函数 call()方法和 apply()方法

js 函数 call()方法和 apply()方法 我们可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用函数。 如下代码,使用call()方法来调用一个对象的 Object.prototype.toString 方法,用以输出对象的类 Object.prototype.toString.apply({}) // "[object Object]" call()...

weixin_36210698的博客 445

JavaScript中函数对象方法 call()、apply()、bind()

函数对象方法,call(),apply(),bind()

前端卷王小白的博客 1342

JavaScript中call()和apply()方法的使用

讲述call()和apply()方法的应用

Bruce_wjh的博客 840

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

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

许建桐的技术博客 243

Js中的Call()和apply()方法

call和apply都是Function对象的原型方法,它们是把特定的函数当作一个方法绑定到指定的对象上进行调用。apply和call的方法和功能用法相同,区别是他们传递的参数的方式不同,其中apply()是用数组的方式进行传递参数,call方法则用数值的方式进行传递参数。而且call()方法只能接受多个参数列表,apply()方法只能接收数组或者伪类数组,数组元素将作为参数传递给被调用的函数。c...

qq_42276997的博客 3440
上一篇: javascript Arguments对象——函数的实际参数 转
下一篇: Java程序员需要了解的几个开源协议 转
tp_tom
博客等级 码龄19年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值