那些迷糊人的回调

在jquery里,我们看到过无数种类的回调,最典型的莫过于jquery封装的ajax里面的回调,例如:

$.ajax({

   type: "POST",

   url: "some.php",

   data: "name=John&location=Boston",

   success: function(msg){

     alert( "Data Saved: " + msg );

   },

  error:function(){

    alert("error!")

  }

});

简单的说,就是往后台下发一个POST请求,当往正常返回值时调用sueccess函数,有错时调用error函数,具体为什么会这么调用,在另外的博文里我会继续探讨。那么,来看看这个回调到底是怎么玩的,我们常说的异步执行和回调又有着怎样的关系,为什么一直就是搞不清楚这二者的区别呢?

先来看一个例子:

var quadratic = function(a){

  return a*a;

};

假若现在有这样的一个场景,先需要做两个数字平方的操作,再把这两个平方求和,那么我们可以先计算平方,再计算加和,这个计算加和的函数,我们直接就调用这个addCal函数即可了,那么,我们可以这样子做:把这个addCal函数当初参数传入,先求算两个数字的平方,再调用加和的函数,最后返回求和之后的值,不就行了吗?说干就干。我写出了这么一段代码:

function quadraticSum(a,b,quadratic){

  return quadratic(a) + quadratic(b);

};

将addCal函数传给形参cb,这样就能将5和1这两个变量保留下来,供后面使用,调用时,写法如下:

var result = quadraticSum(5,12,quadratic);

console.log(result);  //结果是 169

那么函数也是可以作为参数进行传递的,上面的这个例子到底是不是一个回调呢?答案是否定的,这不是一个回调,尤其是并没有标定在quadraticSum执行完之后再执行quadratic函数,这里是执行quadraticSum的同时,在其内部执行quadratic函数,因此,严格的说,这个并不能算是真正的回调函数。

于是,我们一定要清楚,必须是在外部函数已经完全执行完毕,再来调用的那个函数,才称其为回调函数,请注意这里一定是要在前面外部的那个函数的函数体执行完之后,再执行的函数才成为回调函数,它一般在同步情境下是最后执行的,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。

现在来看看下面这个真正的回调例子:

function  a(callback){

alert(‘a‘);

callback.call(this);//callback()或者callback.apply(this)都是可以的

}

function  b(){

alert(‘b‘);

}

a(b);

这样的结果是先弹出 ‘a‘,再弹出‘b’。再看一个有参数传递的,毕竟这种带参数的函数也占到大多数,一起看看吧。

function fn1(callback){

  var sum =0;

  for(var i= 1; i< 100000; i++){

   sum = sum + i;

  };

  console.log(sum);

  callback.call(this,sum);

};

fn1(function(arg){

console.log("The sum result is "+arg);

});     //调用结果为 The sum result is 4999950000

这里专门布置了一个超级大的for循环,并且设置了参数传入的场景,我们可以看到,如期执行完了整个for循环,执行了匿名的回调函数,将sum作为实参执行了回调函数,这样子就实现了我们的回调目的。

时间: 2024-08-10 01:05:47

那些迷糊人的回调的相关文章

基于PROMISE解决回调地狱问题

回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但是该函数又接受一个函数 B 作为参数,甚至 B 还接受 C 作为参数使用,就这样层层嵌套,人称之为回调地狱,代码阅读性非常差. 例如:要发送三个异步的请求要求前面一个请求完成之后再依次发送请求. $.ajax{ url:'url1', success:result=>{ $.ajax{ url:'

解决回调地狱问题

1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但是该函数又接受一个函数 B 作为参数,甚至 B 还接受 C 作为参数使用,就这样层层嵌套,人称之为回调地狱,代码阅读性非常差.比如: var sayhello = function (name, callback) { setTimeout(function () { console.log(nam

java.lang.String

1.String 是一个类,广泛应用于 Java 程序中,相当于一系列的字符串.在 Java 语言中 strings are objects.创建一个 strings 最直接的方式是 String greeting = "Hello world!"; 可以利用新的关键字和 String 构造器创建新对象.String 类有十三个构造器,可以根据传入类型的不同,构造不同的对象.比如 character 数组: char[] helloArray = { 'h', 'e', 'l', 'l

Delphi 之 第七课 字符串操作

字符串类型 在Borland公司的Turbo Pascal和16位Delphi中,传统的字符串类型是一个字符序列,序列的头部是一个长度字节,指示当前字符串的长度.由于只用一个字节来表示字符串的长度,所以字符串不能超过255个字符.这一长度限制为字符串操作带来不便,因为每个字符串必须定长(确省最大值为255),当然你也可以声明更短的字符串以节约存储空间. 字符串类型与数组类型相似.实际上一个字符串差不多就是一个字符类型的数组,因为用[]符号,你就能访问字符串中的字符,这一事实充分说明了上述观点.

基于anyrtc的sdk实现直播连麦互动

基于anyrtc的sdk实现直播连麦互动 前言 1.由于粘贴了较大的代码,造成内容比较长,可能会花费您较长的时间. 2.项目里面没有做权限判断,所以如果发现有页面发生崩溃可能是权限没有打开,请打开权限后再进行尝试. 3.录制的GIF画质好差,真实环境很好. 一.有图有真相 主播端 :     http://d2.freep.cn/3tb_160831194207x8fa572812.gif 游客端 : http://d3.freep.cn/3tb_160831194126nt2e572812.g

浅析STL 谓词 + 仿函数 + 函数指针(c)

一:起因 (0)提到C++ STL,首先被人想到的是它的三大组件:Containers(容器), Iterators(迭代器), Algorithms(算法).容器为用户提供了常用的数据结构(如,vector,list,deque,stack,map,multimap,set,multiset,外加string),算法大多是独立于容器的常用的基本算法(一般在algorithm头文件中,其中sort比较常用),迭代器是由容器提供的一种接口,算法通过迭代器来操控容器.详情请看 博客 (1)接下来要介

单例模式之 懒汉模式普通版

直接上代码: /* 单例模式可以保证:在一个程序当中,一个类有且只有一个实例,并提供一个访问 它的全局访问点 在程序设计当中,很多情况下需要确保一个类只有一个实例 例如: windopws系统中只能有一个窗口管理器 某个程序中只能有一个日志输出系统 一个GUI系统类库中,有且只有一个ImageManager */ #include <iostream> #include "C1.H" #include <windows.h> #include <proce

Spring -- 5.1

Spring事务管理的一些基础知识 JDBC对事务的支持首先要知道并不是所有的数据库都支持事务,即使支持也并非支持所有的事务隔离级别,我们可以通过Connection#getMetaData()方法获取DataBaseMetaData(数据库元数据)对象,并通过该对象的supportsTransactions().supportsTransationIsolationLevel(int level)来查看底层数据库的事务支持情况.JDBC的Connection对象默认是自动提交事务的,也即每条执

javaEE SSH框架 qq第三方登录及用户绑定(java sdk版)

之前有位朋友用js sdk实现了 SSH框架下的qq第三方登录功能,但是我发现使用js sdk 有些无法克服的安全问题,所以我改用java sdk来实现这个功能! 如图,使用java sdk时,回调地址应设置为一个.action链接.(注意!修改回调地址的话,官方不会及时给你审核通过,有的人修改回调地址后一年 官方都没给他审核通过,这意味着[修改回调地址不如 要重新申请一个域名!重新申请一次网站接入]) 使用官方给定的Sdk4J.jar时 控制台会打印许多log信息,这严重影响项目的运行效率,所