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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
JavaScript var声明变量背后的原理示例解析
Oct 12 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
Oct 28 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
js 颜色选择插件
Jan 23 Javascript
BootStrap中的Fontawesome 图标
May 25 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
vue .sync修饰符的使用详解
Jun 15 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
基于vue和bootstrap实现简单留言板功能
May 30 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 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 中的str_replace 函数总结
2007/04/27 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
即兴演讲稿
2014/01/04 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
售后服务承诺书
2014/03/26 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
小学班主任事迹材料
2014/12/17 职场文书
实习生辞职信范文
2015/03/02 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
高中班主任培训心得体会
2016/01/07 职场文书