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 相关文章推荐
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
Aug 28 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
如何解决vue与传统jquery插件冲突
Mar 20 Javascript
常用的 JS 排序算法 整理版
Apr 05 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
JS中的算法与数据结构之列表(List)实例详解
Aug 16 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 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中的多态性[译]
2011/08/02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
js opener的使用详解
2014/01/11 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
jquery选择器简述
2015/08/31 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
JS中的多态实例详解
2017/10/15 Javascript
vue组件的写法汇总
2018/04/12 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
JavaScript创建表格的方法
2020/04/13 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python实现简单http服务器
2018/04/12 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python数据挖掘需要学的内容
2019/06/23 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书