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计数器代码
Nov 04 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
Node.js模块封装及使用方法
Mar 06 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
JS判断是否手机或pad访问实现方法
Dec 09 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
Jan 05 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
React更新渲染原理深入分析
Dec 24 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
正则表达式语法
2006/10/09 Javascript
PHP 图片上传代码
2011/09/13 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
react redux入门示例
2018/04/19 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
python3处理含有中文的url方法
2018/05/10 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
.net软件工程师应聘上机试题
2015/03/10 面试题
销售心得体会
2014/01/02 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
检讨书范文
2019/04/16 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android