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 相关文章推荐
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
jquery中交替点击事件的实现代码
Feb 14 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
Jun 20 Javascript
js带点自动图片轮播幻灯片特效代码分享
Sep 07 Javascript
第二章之Bootstrap 页面排版样式
Apr 25 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
Vue实现点击时间获取时间段查询功能
Aug 21 Javascript
简单分析js中的this的原理
Aug 31 Javascript
JS document文档的简单操作完整示例
Jan 13 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 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
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
js实现随机点名小功能
2017/08/17 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
python Django批量导入不重复数据
2016/03/25 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Tesserocr库的正确安装方式
2018/10/19 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
python脚本定时发送邮件
2020/12/22 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
高中地理教学反思
2014/01/29 职场文书
八一慰问活动方案
2014/02/07 职场文书
依法行政工作汇报
2014/10/28 职场文书
五一劳动节活动总结
2015/02/09 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
2015最新民情日记范文
2015/06/26 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript