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 CSS操作方法集合
Oct 31 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
jquery中$.post()方法的简单实例
Feb 04 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
面试常见的js算法题
Mar 23 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
微信小程序canvas分享海报功能
Oct 31 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php实现映射操作实例详解
2019/10/02 PHP
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
天网面试题
2013/04/07 面试题
新书吧创业计划书
2014/01/31 职场文书
毕业评语大全
2014/05/04 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
机关作风建设心得体会
2014/10/22 职场文书
车队安全员岗位职责
2015/02/15 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
校园新闻稿范文
2015/07/18 职场文书
同学会演讲稿
2019/04/02 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang