js中回调函数的学习笔记


Posted in Javascript onJuly 31, 2014

回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考。

回调函数原理:

我现在出发,到了通知你”
这是一个异步的流程,“我出发”这个过程中(函数执行),“你”可以去做任何事,“到了”(函数执行完毕)“通知你”(回调)进行之后的流程

例子

1.基本方法

<script language="javascript" type="text/javascript">
function doSomething(callback) {
// … 
// Call the callback
callback('stuff', 'goes', 'here');
} 
function foo(a, b, c) {
// I'm the callback
alert(a + " " + b + " " + c);
} 
doSomething(foo); 
</script>

或者用匿名函数的形式

<script language="javascript" type="text/javascript">
 function dosomething(damsg, callback){
  alert(damsg);
  if(typeof callback == "function") 
  callback();
 } 
dosomething("回调函数", function(){
  alert("和 jQuery 的 callbacks 形式一样!");
 }); 
</script>

 
2.高级方法
 
使用javascript的call方法

<script language="javascript" type="text/javascript">
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.call(this);
}
 
function foo() {
alert(this.name);
}
 
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Joe" via `foo`
</script>

 
传参数

<script language="javascript" type="text/javascript"> 
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
// Call our callback, but using our own instance as the context
callback.call(this, salutation);
} 
function foo(salutation) {
alert(salutation + " " + this.name);
} 
var t = new Thing('Joe');
t.doSomething(foo, 'Hi'); // Alerts "Hi Joe" via `foo`
</script>

使用 javascript 的 apply 传参数

<script language="javascript" type="text/javascript">
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.apply(this, ['Hi', 3, 2, 1]);
} 
function foo(salutation, three, two, one) {
alert(salutation + " " + this.name + " ? " + three + " " + two + " " + one);
} 
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Hi Joe ? 3 2 1" via `foo`
</script>

例子
//假如提供的数据源是一整数,为某学生的分数,当num<=0,由底层处理,当n>0时由高层处理.

//将下面这个函数拷贝下来存盘为1.js

function f(num,callback){
 if(num<0) { 
 alert("调用低层函数处理!");
 alert("分数不能为负,输入错误!"); 
 }else if(num==0){
  alert("调用低层函数处理!");
 alert("该学生可能未参加考试!");
 }else{
 alert("调用高层函数处理!");
 callback();
 }
}

//将下面这个test.html文件存盘与1.js在一个目录下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script src="1.js" type="text/javascript"></script>
<title>无标题文档</title>
<script type="text/javascript">
 function test(){
  var p=document.getElementById("pp");
 pp.innerText="";
  var num=document.getElementById("score").value;
 f(num,function(){ //匿名高层处理函数
 if(num<60) alert("未及格!");
 else if(num<=90) alert("该生成绩优良!");
 else alert("该生成绩优秀!"); })
 pp.innerText="by since1978 qq558064!"
 }
</script>
</head>

<body>
<p>
回调函数示例:当学生成绩score<=0分时候,由底层处理;当score>0时,由高层处理。
</p>
请输入学生成绩<input type="text" id="score"> 
<input type="button" onClick="test()" value=" 看看结果">
<p id="pp"></p>
</body>
</html>

下面是其它网友的补充:

javascript中的回调模式:

形如:

function writeCode(callback){ 
   //执行一些事物, 
   callback(); 
   //... 
  } 
 
  function intrduceBugs(){ 
   //....引入漏洞 
  } 
 
writeCode(intrduceBugs);

        我们传递函数的应用给writeCode(),让writeCode在适当的时候来执行它(返回以后调用)

先看一个不怎么好的例子(后续要对其重构):

//模拟查找页面中的dom节点,将查找到的节点存在数组里面统一返回 
  //此函数只用于查找不对dom节点做任何的逻辑处理 
  var findNodes = function(){ 
   var i = 100000;//大量的循环, 
   var nodes = [];//用于存储找到的dom节点 
   var found; 
   while(i){ 
    i -=1; 
    nodes.push(found); 
   } 
   return nodes; 
  } 
 
  //将查找找到的dom节点全部隐藏 
  var hide = function(nodes){ 
   var i = 0, 
    max = nodes.length; 
   for(;i<max;i++){ 
//findNodes后面有括号代表立即执行,先执行findNodes()然后执行hide()< hide(findNodes()); 执行函数 } ; 
nodes[i].style.display="none"
}

上面的方法是低效的,以为hide()必须再次遍历有findNodes()返回的数组节点,如何避免这种多余的循环呢。 
  我们不能直接在findNodes中对查询到的节点进行隐藏(这样检索就可修改逻辑耦合了),那么他就不再是一个通用函数了。 
  解决方法是用回调模式,可以将节点隐藏逻辑以回调函数方式传递给findNodes()并委托其执行

//重构findNodes以接受一个回调函数 
   var findNodes = fucntion(callback){ 
    var i = 100000, 
     nodes = [], 
     found; 
    //检查回调函数是否可用调用的 
    if(typeof callback !== 'function'){ 
     callback = false; 
    } 
    while(i){ 
     i -= 1; 
     if(callback){ 
      callback(found); 
     } 
     nodes.push(found); 
    } 
    return nodes; 
   } 
 
   //回调函数 
   var hide = function(node){ 
    node.style.display = 'none '; 
   } 
   //找到后续节点并在后续执行中对其进行隐藏 
 findNodes(hide);//先执行findNodes然后执行hide,当然回调函数也可以在调用主函数时创建:findNodes(function(node){node.style.display = 'none';});
Javascript 相关文章推荐
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
jQuery控制输入框只能输入数值的小例子
Mar 20 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
js 自定义个性下拉选择框示例
Aug 20 Javascript
JavaScript获得url查询参数的方法
Jul 02 Javascript
jquery实现简单的二级导航下拉菜单效果
Sep 07 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
浅析$(function) ready和onload 的区别
Sep 03 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
Vue实现页面添加水印功能
Nov 09 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 #Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
Jul 30 #Javascript
JQuery实现表格动态增加行并对新行添加事件
Jul 30 #Javascript
jQuery修改CSS伪元素属性的方法
Jul 30 #Javascript
教你在heroku云平台上部署Node.js应用
Jul 30 #Javascript
浅析Node在构建超媒体API中的作用
Jul 30 #Javascript
JS实现图片无间断滚动代码汇总
Jul 30 #Javascript
You might like
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
js实现常用排序算法
2016/08/09 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
介绍Java的内部类
2012/10/27 面试题
体育专业个人的求职信范文
2013/09/21 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript
Win10 Anaconda安装python-pcl
2022/04/29 Servers