JS回调函数原理与用法详解【附PHP回调函数】


Posted in Javascript onJuly 20, 2019

本文实例讲述了JS回调函数原理与用法。分享给大家供大家参考,具体如下:

JS回调函数

何为回调函数,官方解释:当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。

通常将一个函数B传入另一个函数A,并且在需要的时候再调用函数A。

说白了,回调就是回溯,先定义好将要使用的函数体,然后在使用使再调用这个函数,我们通常把callback作为一个参数传入先定义的那个函数。下面我们先来看一段jquery代码:

$("p").hide(1000,function(){
alert("The paragraph is now hidden");
});

上面jquery就是一个回调函数,首先它在执行完hide效果后,接着调用function回调函数。

我们再来看一段JS代码,看看回调函数是如何实现的:

function Buy(name,goods1,callback) {
  alert(name+' buy '+goods1);
  if(callback&&typeof(callback)==="function")
    callback();
}
Buy('xiaoming','apple',function(){
  alert("shopping finish");
});

一个很简单的代码,一开始不知道要买啥,等到买到东西,立即把之前定义好的函数调用出来,最好加上判断规则,因为一切前提是callback必须是一个函数,输出结果为:

xiaoming buy apple
shopping finish

闭包与回调

下面看一道闭包的题目,分别点击第一个和第四个节点,执行结果:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
  nodes[i].addEventListener('click', function() {
    console.log('You clicked element #' + i);
  });
}

这里虽然主要考的是闭包,addEventListener是一个闭包,而匿名函数是一个回调函数,i是在闭包中的变量。在addEventListener的回调执行时,循环已经结束,此时的变量i被赋值为node.length,node.length为总节点数。所以结果就是

You clicked element # node.length

那要怎么改,将其返回值改成函数,既然i变量的值会被释放,那我们就引入i,让每次循环的值都保存在内存中,就可以了:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
(function(i) {
  nodes[i].addEventListener('click', function () {
    console.log('You clicked element #' + i);
    })
  })(i);
}

PHP回调函数

下面略说一下php中回调函数如何实现(结果为1,2,3,4):

<?php
  $array=array(1,2,3,4);
  array_walk($array,function($value){
    echo $value;});
?>

php对每个传入的数组元素作回调处理,下面再看看php的闭包,使用use关键字继承作用域外的变量:

<?php
  function getcouter(){
    $i=0
    return function() use($i)(
      echo $i;
    )};
  }
  $counter=getcounter();
  echo $counter();
  echo $counter();
?>

返回结果为:

1,1
1

官方php使用方法

class hello {
function callback($a,$b) {
echo "$a,$b";
}
static function callback($c,$d){
echo "$c,$d";
}
}
//将类名作为参数
call_user_func(array('hello','callback'),"hello","world");
//输出 hello,world
//将对象作为参数
call_user_func(array(new hello(),'callback'),"hello","world");
//将静态方法作为参数
call_user_func(hello::callback,"hello","world");
//输出 hello,world

其实就原理来说,JS和php都是差不多的,都是先定义好函数,然后需要的时候就调用过来。

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

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

Javascript 相关文章推荐
mapper--图片热点区域高亮组件官方站点
Dec 22 Javascript
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
Feb 20 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
利用vscode调试编译后的js代码详解
May 14 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 Javascript
JavaScript展开操作符(Spread operator)详解
Jul 20 #Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 #Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 #Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 #Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 #Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 #Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
Jul 19 #Javascript
You might like
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php中Ctype函数用法详解
2014/12/09 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
可以支持多中格式的JS键盘
2007/05/02 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python基础教程项目三之万能的XML
2018/04/02 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
财务人员担保书
2014/05/13 职场文书
学校党员对照检查材料
2014/08/28 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
学校党支部承诺书
2015/04/30 职场文书
追讨欠款律师函
2015/05/27 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技