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 相关文章推荐
两个数组去重的JS代码
Dec 04 Javascript
jquery动态添加option示例
Dec 30 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
Jun 01 Javascript
Javascript复制实例详解
Jan 28 Javascript
Node.js Express 框架 POST方法详解
Jan 23 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
jQuery选择器特殊字符与属性空格问题
Aug 14 jQuery
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
Oct 25 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 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 面向对象的一个例子
2011/04/12 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
CSS和Javascript简单复习资料
2010/06/29 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python实现画图软件功能方法详解
2020/07/28 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
经济系大学生求职信
2013/10/01 职场文书
出纳的岗位职责
2013/11/09 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
小学生交通安全寄语
2015/02/27 职场文书
公司董事任命书
2015/09/21 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL