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 相关文章推荐
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
微信小程序 封装http请求实例详解
Jan 16 Javascript
JS将unicode码转中文方法
May 08 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 07 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
JavaScript实现单图片上传并预览功能
Sep 30 Javascript
Node.js学习之内置模块fs用法示例
Jan 22 Javascript
通过javascript实现扫雷游戏代码实例
Feb 09 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开启openssl的方法
2014/05/15 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
PHP7 新增常量
2021/03/09 PHP
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python高级用法总结
2018/05/26 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
应届生程序员求职信
2013/11/05 职场文书
自我反省检讨书
2014/01/23 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书