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如何判断某元素是否具备指定的样式
Nov 05 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 Javascript
详解Javascript继承的实现
Mar 25 Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 Javascript
JavaScript函数参数的传递方式详解
Mar 06 Javascript
vue父组件通过props如何向子组件传递方法详解
Aug 16 Javascript
node跨域请求方法小结
Aug 25 Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 Javascript
Vue2.0系列之过滤器的使用
Mar 01 Javascript
Vue监视数据的原理详解
Feb 24 Vue.js
canvas 中如何实现物体的框选
Aug 05 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
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
python3多线程知识点总结
2019/09/26 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
动物科学专业求职信
2014/07/27 职场文书
旅游活动总结
2014/08/27 职场文书
初中家长评语和期望
2014/12/26 职场文书
尼克胡哲观后感
2015/06/08 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python