JavaScript中的call和apply小结

如何理解js中的call及apply? 这里是修真院前端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能,本篇分享的是: 【如何理解js中的call及apply? 】 大家好,我是IT修真院北京分院第22期学员,一枚正直善良的web程序员。 1.背景介绍 call 和 apply 都是为了改变某个函数运行时的 conte... 阅读详情

JavaScript远比Java等语言更灵活,call和apply就一个体现。


区分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变量永远指向当前代码所处的对象中.

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

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

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

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

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

function print(a, b, c, d) {
  alert(a + b + c + d);
}

function example(a, b, c, d) {
  //用call方式借用print,参数显式打散传递
  print.call(this, a, b, c, d);
  //用apply方式借用print, 参数作为一个数组传递,
  //这里直接用JavaScript方法内本身有的arguments数组
  print.apply(this, arguments);
  //或者封装成数组
  print.apply(this, [a, b, c, d]);
}
//下面将显示”背光脚本”
example("Hello", "JavaScript", "Programming", "Language");

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

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

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

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

 

应用场景:

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

//例
print.call(window, "Hello", "JavaScript", "Programming", "Language");
//foo参数可能为多个
function foo(){
print.apply(window, arguments); 
}


Ref: http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html


================================================================================================

call 方法 
请参阅 
应用于:Function 对象 
要求 
版本 5.5 
调用一个对象的一个方法,以另一个对象替换当前对象。 
call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 
参数 
thisObj 
可选项。将被用作当前对象的对象。 
arg1, arg2, , argN 
可选项。将被传递方法参数序列。 
说明 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

------------------------------------------------------------------------------------------- 
乍一看,很容易把人看迷胡,先做一些简单的说明 
obj1.method1.call(obj2,argument1,argument2) 
如上,call的作用就是把obj1的方法放到obj2上使用,后面的argument1..这些做为参数传入. 
举一个具体的例子 

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

function sub(a, b) {
  alert(a - b);
}
add.call(sub, 3, 1);

这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。 

看一个稍微复杂一点的例子 

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"); 
怎么样,觉得有意思了吧,可以让a对象来执行b对象的方法,这是java程序员所不敢想的。还有更有趣的,可以用 call 来实现继承 

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

function Class2() {
  Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc");

这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中不就有Class1 的所有属性和方法了吗,c2 对象就能够直接调用Class1 的方法以及属性了,执行结果就是:alert(“cc”); 
对的,就是这样,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。

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); 
} 

很简单,使用两个 call 就实现多重继承了 
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法 
说了call ,当然还有 apply,这两个方法基本上是一个意思 
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments 
还有 callee,caller,这个和call的 用法就不同了,放到下次讲吧 ,呵呵。


Ref: http://www.jb51.net/article/22963.htm


========================================================================================================


Javascript中call的使用  

Javascript中call的使用自己感觉蛮纠结的,根据文档很好理解,其实很难确定你是否真正的理解。

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

1.最基本的理解:示例1

自定义一个类,该类有一个方法showTxt,用来显示当前对象的name值。

创建一个对象,并且该对象的name值等于test1。

使用call方法,使新创建的对象obj添加Class1类的showTxt方法,即把Class1类中的this.showTxt中的this指定成obj,这样obj就有了showTxt方法。弹出"test1"。

function Class1() {
  this.showTxt = function() {
    alert(this.name)
  }
}
var obj = new Object();
obj.name = "test1"
Class1.call(obj);
obj.showTxt(); //test1
alert(obj.showTxt); //function(){alert(this.name)}

这个例子很容易理解。

2.再看一个稍微深入的理解

示例2:创建Class1的实例,让这个实例调用showTxt方法返回这个实例的name值,因为这个实现没有name值所以返回undefine.


function Class1() {
  this.showTxt = function() {
    alert(this.name)
  }
}
var class1 = new Class1();
class1.showTxt(); //undefined
alert(class1.showTxt); //function(){alert(this.name)}

示例3: 下面就给Class1添加个name值,这时class1再调用showTxt方法,会返回class1,这是因为给类添加了name值,所以实例的name也由undefine变成了class1.

function Class1() {
  this.name = 'class1'; //添加name值
  this.showTxt = function() {
    alert(this.name)
  }
}
var class1 = new Class1();
class1.showTxt(); //class1
alert(class1.showTxt); //function(){alert(this.name)}

示例4: Class1.call(obj) 这个操作把Class1中的this.name,this.showTxt里的this替换成了obj,所以就变成了obj.name='class1',所以obj.showTxt在执行时返回class1。

function Class1() {
  this.name = 'class1'; //添加name值
  this.showTxt = function() {
    alert(this.name)
  }
}

function Class2() {
  this.name = 'class2';
}
var class2 = new Class2();
Class1.call(class2);
alert(class2.showTxt); //function(){alert(this.name)}
class2.showTxt(); //class1

示例5: 如果在Class1.call(obj);之后再添加obj.name = 'test1',最后结果会输入test1,原因显而易见。

function Class1() {
  this.name = 'class1'; //添加name值
  this.showTxt = function() {
    alert(this.name)
  }
}

function Class2() {
  this.name = 'class2';
}
var class2 = new Class2();
Class1.call(class2);
class2.name = 'test1'; //重定义obj.name值
alert(class2.showTxt); //function(){alert(this.name)}
class2.showTxt(); //test1

上面的例子call的都是一个对象的实例,接下来的案例把对象的实例直接换成函数,看看执行结果会发生哪些变化

3.把call方法的第一参数由实例换成函数看看会怎么

示例6:Class2是一个function对象的引用,在执行Class1.call(Class2)时this.showTxt里的this被替换成了Class2。这样Class2就有了showTxt方法,Class2.showTxt()执行时会返回Class2.name的值

function Class1() {
  this.showTxt = function() {
    alert(this.name)
  }
}

function Class2() {
  this.name = 'class2';
}
Class1.call(Class2);
alert(Class2.showTxt); //function(){alert(this.name)}
Class2.showTxt(); //Class2



4.接着看下面的例子

示例7:class1.showTxt.call(class2);之所以会返回class2是因为function(){alert(this.name)}这里的this被call指定成了class2,变成了alert(class2.name),所以会返回class2.

alert(class2.showTxt)返回undefined,说明并未定义class2.showTxt方法。

function Class1() {
  this.showTxt = function() {
    alert(this.name)
  }
}

function Class2() {
  this.name = 'class2';
}
var class1 = new Class1();
var class2 = new Class2();
class1.showTxt.call(class2); //class2
alert(class2.showTxt); //undefined

因为并为给class2添加showTxt方法,所以提示该错误。如果在这个调用之前添加Class1.call(class2);这个调用就OK了

Class1.call(class2);
class2.showTxt();//class1

function Class1(){
    this.showTxt = function(){alert(this.name)}
}
function Class2(){
    this.name = 'class2';
}
var class1 = new Class1();
class1.showTxt.call(Class2);//Class2
alert(Class2.showTxt);//undefined

5.在使用call时如果调用函数里没有this会怎么样

示例9:


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

function sub(a, b) {
  alert(a - b);
}
add.call(sub, 3, 1); //4

结果返回4,add.call(sub,3,1)在执行过程中,sub做为add函数中this的替代品出现,但是因为add里没有用到this,所以sub函数直接忽略,所以结果是4。

所以实际执行如下:返回4。


function add(a,b){
    alert(a+b);
}
add(3,1);//4

Ref:  http://hszy00232.blog.163.com/blog/static/43022753201131835653841/


机器人动力学仿真软件:Webots_(14).机器人声音仿真 Webots 中的声音仿真主要通过Sound和两种节点来实现。Sound节点用于播放预定义的音频文件,而节点则允许在仿真过程中动态生成和播放声音。这些节点可以用于模拟机器人的语音输出、报警声、环境噪音等。以下是一个示例,展示如何在控制器代码中播放预定义的声音。// 控制器代码(.c) # include <webots/robot.h> # include <webots/sound.h> # define TIME_STEP 64 const char * sound_name = "sound"; 阅读详情

相关推荐

步进电机梯形加减速算法的实现

步进电机梯形加减速算法的实现

m0_69251699的博客 1318

JavaScript中的 Call 和 Apply

1. call 和 apply的区别 Function.prototype.call 和 Function.prototype.apply都是非常常用的方法,它们的作用一模一样,区别仅在于传入参数形式的不同。 apply接受两个参数,第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可能为类数组,apply 方法把这个集合中的元素作为参数传递给.........

分享前端工程化、AI 应用、Agent 开发与大模型实践! 7334

JMeter压测Dubbo接口的完整落地方案(适配3.x)

Dubbo作为主流Java微服务RPC框架,其接口压测长期面临协议私有、注册发现复杂、序列化耦合度高等技术门槛。理解Dubbo基于TCP长连接、泛化调用与SPI扩展机制的核心原理,是实现稳定压测的前提;技术价值在于绕过HTTP网关直击服务核心链路,保障大促等关键场景的性能可信度;典型应用场景包括电商订单链路压测、风控/库存等内部Dubbo服务SLA验证,以及CI/CD中性能左移实践。本文聚焦Dubbo 3.x版本,提供零第三方插件、可复用、避坑的JMeter Java Sampler落地路径。

weixin_33700809的博客 549

JavaScript之apply()与call()细谈

重学JavaScript,这篇文章我们主要学习了JavaScript的apply()与call()方法,这两个对于我们的JavaScript的基础学习来说是非常重要的,只有把基础知识学好了,才能更好进阶,努力想技术大牛看齐,坚持学习,精进。

flym_的博客 1372

GPU大规模集群运维

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的通用并行计算平台和程序模型,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用C语言来为CUDA架构编写程序,所编写出的程序可以在支持CUDA的处理器上以超高性能运行。CUDA官方文档CUDA的软件环境允许开发者使用C++等高级编程语言开发程序。

weixin_42795092的博客 1738

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1181

【JS】call和 apply函数的详解

call()和apply()方法在功能上相似,主要区别在于参数的传递方式。选择合适的方法可以使代码更加清晰和高效。理解这两个方法的区别及其适用场景,对于深入掌握JavaScript而言非常重要。

九日的博客 1082

如何降低 Claude Code 封号风险:实用指南

本文针对 Claude Code 用户频繁遭遇账号封禁的问题,提供了一套经过实战验证的解决方案。通过分析封号的根本原因——共享VPN导致的IP异常标记,文章详细介绍了如何通过"独立服务器+中转服务+环境配置"三步走策略,显著降低封号风险。

goodparty的专栏 2125

JavaScript中的call、apply、 bind的用法、实现以及三者之间的区别?

相信很多同学在面试中遇到这样的问题,今天我们就彻底搞懂JavaScript中的call、apply、 bind的用法、实现以及三者之间的区别,废话不多说,直接开撸!

富朝阳的博客 3044

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 976

【异常】OpenClaw对接钉钉/飞书配对成功但无响应 全流程排查指南(适配阿里轻量服务器+OpenClaw)

下面按「先快速定位根因→通用核心排查→平台专属排查→兜底方案」的顺序,一步步解决,新手也能跟着操作。

奶爸的编程之路,也就一周冷个三天 696

掌握JavaScript中的Call和Apply,让你的代码更强大、更灵活

在学习JavaScript时,你可能会遇到call和apply这两个方法。它们的作用其实很相似,都是用来调用函数并设置函数内部的this值,但它们的使用方式稍有不同。想象一下,你和朋友们一起拍照。call就像是你一一叫朋友们的名字,让他们各自摆好姿势然后拍照,而apply则像是你一次性告诉大家一个姿势,让所有人一起摆好再拍照。虽然最终目的是一样的,但方式有些差别。想了解更多关于call和apply...

前端达人 1089

【maven】maven 3.8.1 版本编译java 17的项目报错 java.lang.ExceptionInitializerError to make field private com.s

排查发现一切正常,但是内网就是不行,然后我就想把我的程序从java 11 改成java 17,然后执行编译的时候报错。这个问题是我们内网java代码升级,项目比较复杂,是从java 8 升级到java 17,然后报错。maven-compiler-plugin 3.8.1 版本编译java 17的项目,报错。然后查看一下这个项目的lombok,结果发现还是老的版本。怀疑是不是这个问题呢?使用最新的版本就可以了。

九师兄 780

javascript关于this,call,apply的小结

this javascript中this总是指向一个对象,this对象是根据执行环境决定的. 当函数被作为某个对象的方法调用的时候,this指向该对象。当函数不作为对象的属性被调用时,即作为普通函数,此时this指向全局对象,即window对象。 此外匿名函数的执行环境具有全局性。 window.name = 'window'; var Person = { name : 'zll

akinowind的博客 263

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

js中call与apply的用法小结

js中call与apply的用法小结 本篇文章主要是对js中call与apply的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 前天去面试,有个gg问了一些js知识,其中有一道call与apply用法的题目,尽管在365天前用过call方法,但当时还是没能答上来,今天深入总结一下 call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两

taoerchun的专栏 4636

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

js中的call、apply、bind 用法区别小结

一、实现效果 1、call 改变 this 指向;自动执行函数;参数列表形式传入 // 定义上下文 let ctx = { name: `yayxs` }; // 定义函数 const fn = function(age, sex) { console.log(`${this.name}-${age}-${sex}`); }; // 调用函数 fn(18, `男`); 2、apply 改变...

qq_39581763的博客 175

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

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

JS中的call和apply小结

1、 每个函数都包含两个非继承而来的方法:call()方法和apply()方法 function changeColors(){     console.log('aaa') } changeColors.call()//aaa changeColors.apply()//aaa 2、二者作用是一样的,都是在特定的作用域中调用函数,等于重置了函数体内this对象的值,用来扩充函数的作用域 ...

ch071714301的专栏 208

JS中的call()、apply()和bind()小結

函数的三种调用方式 : 全局函数 对象方法 构造函数 *共同点,this的执行时确定的无法修改 a.全局函数:this指向window b.对象方法:this指向对象 c.构造函数:this指向new创建的对象 上下文调用模式:可以动态修改this的指向 三种语法异同点: 相同点: 作用都是动态修改this 不同点:传参方式不一样 call(): 函数名.call(修改后的this,arg1,arg2,arg3………………) apply(): 函数名.apply(修改后的this,[arg

JQ___的博客 181

JS中函数的方法,call和apply,this小结

call()和apply(), 这两个方法是函数对象的方法,需要通过函数对象来调用,当函数用call()和apply()都会调用函数执行。 function fun(){ alert("我是fun方法"); } fun.call(); fun.apply(); var obj = {}; 在调用call()和apply()时,可以将一个对象指定为第一个参数,这个对象将会成为函数执行时的this。 function fun(){ alert(this); } //声明一个对象 var

Fantasc的博客 223

js中call,apply,bind的使用小结

why?call,apply,bind干什么的?为什么要学这个?  一般用来指定this的环境,在没有学之前,通常会有这些问题。var a = { user:"追梦子", fn:function(){ console.log(this.user); } } var b = a.fn; b(); //undefined我们是想打印对象a里面的user却打印出来...

wh_xmy的博客 332

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

虽然在实际项目中我都没有用过这两个方法,但是最近在回顾 JS 知识点的时候又碰到了它们,所以想记录一下。 首先:call 和 apply 都是为了解决改变 this 的指向,作用都是相同的。 function check(){ console.log("this::", this); console.log("this.a::", this.a); } var s = {a:...

qq_24331363的博客 310

js中的apply call 操作小结(参考自网络)

1、方法定义 call方法:      语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 说明: call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 this...

weixin_30364325的博客 85

js中的call和apply

call和apply是替换前面函数内部的this指针以及传递参数。 区别是 call传递的参数是序列1,2,3,4 apply传递的参数是集合型[1,2,3,4]

赵佳敏的博客 8163

JavaScript中的this、call和apply

在JavaScript编程中,this关键字总是让初学者感到迷惑,Function.prototype.call和Function.prototype.apply这两个方法也有着广泛的运用。我们有必要在学习设计模式之前先理解这几个概念。 this 跟别的语言大相径庭的是,JavaScript的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境...

wuyufa1994的博客 1741

手写js中的call和apply

目 录bind、call和apply的区别与联系手写一个call手写一个apply(与call基本类似) bind、call和apply的区别与联系 1、联系: ①. 作用上:它们三个都可以绑定this指向,因为函数内部的this由运行的方式决定,this的指向常常会发生变化,这是就会产生绑定的需要。 ②. 使用上,三个函数的第一个参数都是this将要指向的对象,它们后面的参数(即除第一个参数外的其他参数位置)可以用来放被调用函数的参数 2、区别: bind 是返回对应函数,便于稍后调用;apply 、ca

weixin_45704555的博客 467

Js中的apply、call和bind方法

背景 JS中有一个关键概念叫做执行上下文,也就是JavaScript 代码被解析和执行时的环境。执行上下文有三种类型:全局执行上下文、函数执行上下文和Eval 函数执行上下文。在执行上下文的创建阶段,会确定当前执行上下文中this指针的指向。 而call,apply,bind的作用,就是改变函数执行时的上下文,即改变函数内部的this指向。 Apply,Call 参考资料 ...

weixin_45693198的博客 2863
上一篇: 面试大总结之一:Java搞定面试中的链表题目
下一篇: Flatten Binary Tree to Linked List 二叉树变成链表@LeetCode,
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值