JavaScript直接调用函数与call调用的区别实例分析


Posted in Javascript onMay 22, 2020

本文实例讲述了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.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Mootools 1.2教程(21)——类(二)
Sep 15 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
Aug 07 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 Javascript
浅析JavaScript函数的调用模式
Aug 10 Javascript
浅谈react受控组件与非受控组件(小结)
Feb 09 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
js数据类型转换与流程控制操作实例分析
Dec 18 Javascript
JavaScript实现简单的计算器
Jan 16 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 Javascript
js事件机制----捕获与冒泡机制实例分析
May 22 #Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 #Javascript
详解如何修改 node_modules 里的文件
May 22 #Javascript
Node.js API详解之 readline模块用法详解
May 22 #Javascript
vue+canvas实现移动端手写签名
May 21 #Javascript
基于canvas实现手写签名(vue)
May 21 #Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
You might like
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
js获取字符串最后一位方法汇总
2014/11/13 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
python导入模块交叉引用的方法
2019/01/19 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
个人求职简历的自我评价
2013/10/19 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
公务员政审个人总结
2015/02/12 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
政审证明材料
2015/06/19 职场文书
城南旧事读书笔记
2015/06/29 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技