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 相关文章推荐
用cssText批量修改样式
Aug 29 Javascript
Javascript 判断客户端浏览器类型代码
Mar 01 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
Aug 07 Javascript
jquery easyui combox一些实用的小方法
Dec 25 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
javascript最基本的函数汇总
Jun 25 Javascript
JS 实现 ajax 异步浏览器兼容问题
Jan 21 Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
layui 设置table 行的高度方法
Aug 17 Javascript
如何从0开始用node写一个自己的命令行程序
Dec 29 Javascript
vue滚动tab跟随切换效果
Jun 29 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
PHP通用检测函数集合
2011/02/08 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python获取本机所有IP地址的方法
2018/12/26 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
入党自我鉴定
2014/03/25 职场文书
运动会开幕式主持词
2014/03/28 职场文书
公休请假条
2014/04/11 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
销售会议开幕词
2015/01/28 职场文书
考试后的感想
2015/08/07 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers