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 Map 和 List 的简单实现代码
Jul 08 Javascript
jquery map方法使用示例
Apr 23 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
js实现宇宙星空背景效果的方法
Mar 03 Javascript
jQuery与getJson结合的用法实例
Aug 07 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
JavaScript正则获取地址栏中参数的方法
Mar 02 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
浅谈webpack编译vue项目生成的代码探索
Dec 11 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
Sep 29 Javascript
微信小程序实现展示评分结果功能
Feb 15 Javascript
Webpack中loader打包各种文件的方法实例
Sep 03 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
php 获取完整url地址
2008/12/20 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
Python文件去除注释的方法
2015/05/25 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python3 拼接字符串的7种方法
2018/09/12 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
承诺书怎么写
2014/03/26 职场文书
教师节学生演讲稿
2014/09/03 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers