本文实例讲述了JavaScript直接调用函数与call调用的区别。分享给大家供大家参考,具体如下:
直接调用
直接调用函数是最常见 最普通的方式,直接以函数附加的对象作为调用者, 在函数后括号内传入参数来调用函数
例如:
window.alert("测试代码");
其中调用者如果是window可以省略, 即直接alert("测试代码");
以call() 方法调用函数
语法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);
新同学看来好像直接调用就够了, 其实不然, 直接调用函数方式简单易用但不够灵活, 有些时候调用函数时需要动态地传入一个函数的引用,此时为了动态地调用函数,就需要使用call方法来调用了
举个例子:
<script type="text/javascript"> var each =function(array,fn) { for(var index in array) { fn.call(null,index,array[index]); } } each([4,20,3],function (index,ele) { document.write("第"+index+"个元素是"+ele+"<br/>"); } ); </script>
乍看可能比较晕, 注意fn.call语句, call调用的格式是在参数第一个填调用者,后边按顺序输入参数, 参数形式比较特别, 与直接调用不同,调用者不写在前面, 而是参数第一项. 格式: fn.call(obj,args);
看到这里大家应该会有疑问, call到底和直接调用有什么区别, 区别就在于call调用修改了this指针的指向, 如果被调用的函数里压根没用到this也就没有什么区别了
再举一个被调用函数有this指针的例子:
var x = "我是全局变量"; //定义全局变量x function a(){ //定义函数类结构a this.x = "我是在函数类结构a中声明的哦"; } //定义普通函数,弹出当前指针所包含的变量x的值 function f(){ alert (this.x); } //返回值为“我是在函数类结构a中声明的哦” f.call(new a());
我的理解是,f.call(new a())就是把函数(其实也是对象)f复制到被调用对象“new a()”下面去解析,事实上和下面这段代码的解析结果一样:
function a(){ this.x = "我是在函数类结构a中声明的哦"; alert(this.x); } a();
事实上,是在调用f.call()的时候,修改了f()中的this指向。本来,f中的this.a,this.b属性都是自身的,但是通过f.call()调用时,传入了一个新的对象e()(this),这样,将e绑定到了f的this中,本来是给f增加的属性,加到了e中。(e与e(),f与f()都是等价的)有点类似于“继承”,但是这个应该叫 JS中对象冒充
以apply()方式调用函数
apply() 方法与call()方法的功能节本相似 ,都可以用来动态地调用函数. apply()与call()的区别如下:
- 通过call()调用函数时必须在括号中详细地列出每个参数
- apply()动态地调用函数时, 需要以数组的形式一次性传入所有调用参数
语法:apply([thisObj [,argArray] ]);
比如下面的两个语句是相等的:
myfun.call(window,12,13); myfun.capply(window,[12,13]);
在修改this指针这点上,apply()与call()也保持一致,
大体上来说apply()与call()只在传参形式上有些差别而已.
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]