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 相关文章推荐
工作需要写的一个js拖拽组件
Jul 28 Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 Javascript
javascript运算符——逻辑运算符全面解析
Jun 27 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
Jul 02 Javascript
vue异步axios获取的数据渲染到页面的方法
Aug 09 Javascript
JS实现的类似微信聊天效果示例
Jan 29 Javascript
TypeScript的安装、使用、自动编译的实现
Apr 10 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
vscode自定义vue模板的实现
Jan 27 Vue.js
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
浅析php适配器模式(Adapter)
2014/11/25 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
python实现矩阵乘法的方法
2015/06/28 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
python3 读取Excel表格中的数据
2018/10/16 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
python验证码图片处理(二值化)
2019/11/01 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
学生保证书范文
2014/04/28 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
优秀党员推荐材料
2014/12/18 职场文书
财务负责人岗位职责
2015/02/03 职场文书
教师个人总结范文
2015/02/11 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
小学毕业教师寄语
2019/06/21 职场文书
Linux中各个目录的作用与内容
2022/06/28 Servers