一,再一次理解回调函数

 (function($){
     $.fn.shadow = function(opts){
         //定义的默认的参数
         var defaults = {
             copies: 5,
             opacity:0.1,
             //回调函数
  copyOffset:function(index){
                 return{x:index,y:index};
             }
         };
         //将opts的内容合并到default中。
         var options = $.extend(defaults,opts);
         return this.each(function(){
             var $originalElement  = $(this);
             //设置参数对象
             for(var i=0;i<options.copies;i++)
             {
                 var offset = options.copyOffset(i);
                 $originalElement
                 .clone()
                 .css({
                     position:'absolute',
                     left:$originalElement.offset().left + offset.x,
                     top:$originalElement.offset().top + offset.y,
                     margin:0,
                     zIndex:-1,
                     //设置参数对象
                     opacity:options.opacity
                 })
                 .appendTo('body');
             }
         });
     };
 })(jQuery);
 $(document).ready(function(){
     $('h1').shadow({
         copies:5,
39         copyOffset:function(index){
               alert("我被执行了");
         return {x:-index,y:-2 * index};
         }
         alert("先于copyOffset函数执行的");
     });
 });

在这里我们注意了

copyOffset:function(index){
return {x:-index,y:-2 * index};
}

就是一个回调函数,当代吗执行到

39行时,在这里并没有往return {x:-index,y:-2 * index};这行代码走,在这里只是一个赋值的过程,这时候代码会继续往下走,走到alert("先于copyOffset函数执行的");这一行的,至于什么时候执行alert("我被执行了");就是回调函数执行完了之后在执行的但是它一定是在  先于copyOffset函数执行的  之后执行的。

至于回调函数里面的执行规律请见

jquery回调函数的一个案例

二,理解ajax

反面案例

 $(document).ready(function(){
     $('#txt').val('000000');//给文本框初始值
     $('#btn01').bind('click',function(){
         $.ajax({
             type: "POST",
             url: "<%=request.getContextPath() %>/vumssmer/vmerservice!studyCallBack.do",
             data:'',
             success:function(msg){
                 console.log('msg.vflag:' + msg.vflag);
                 console.log('msg.vmsg:' + msg.vmsg);
                 $('#txt').val(msg.vflag);
                 outerdata = msg.vflag;
             }
         });
         if (outerdata == 'true'){
             console.log('文本框内容是:' + $('#txt').val());
             console.log('公共变量的值是:' + outerdata);
             console.log('yes');
         }else{
             console.log('文本框内容是:' + $('#txt').val());
             console.log('公共变量的值是:' + outerdata);
             console.log('no');
         }
     });
 });

所谓的ajax就是异步的,它的定义是在不刷新页面的情况下,来动态的修改数据,或者说去查数据库,
这里最关键的就是ajax中应用了回调函数的原因,单代码走到 success:function(msg){}这一步的时候,存储的函数是不会被调用的,因为这只是一个赋值操作。就会直接跳过这个方法体里面的信息而,直接往下走,执行方法体外面的代码,
这时候当多线程执行完success:function(msg)会把值赋值到里面去的,至于什么时候执行完就要看ajax配置的url里面的代码处理量的大小了。
这样的好处有:
(1)可以让实现方,根据回调方的多种形态进行不同的处理和操作。(ASIHttpRequest)
(2)可以让实现方,根据自己的需要定制回调方的不同形态。(UITableView)
(3)可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。
(4)让代码的逻辑更加集中,更加易读。

Ajax里的回调函数只是我们赋值给XMLHttpRequest对象的回调函数,它的执行和我们所写的调用ajax函数无关。
实际运用中如果我们想在执行完ajax请求后,根据请求结果执行相关的逻辑,那么请把逻辑写在ajax的回调函数里,只有这样才能让代码按业务逻辑正常运行。

所以通过上面的分析我们可以得出答案,当我们要用ajax返回的值时,一定要把处理的方法写在ajax方法里面来。而不是像上面的案例那样。

如果想详细的理解ajax和回调函数请见,

对ajax回调函数的研究

所以我们有时候可以看到当在前台打断点的时候,一旦碰到success:function(msg){}类似这种的情况断点就会直接跳过去的,假如在后台打断点的时间足够多的话就不会跳过去,一般情况下都会跳过去的,这就是回调函数的原因当执行到这一行的时候只是赋值的过程,而回调的函数还没有返回要求的值的,这时候就有点类似与多线程就会往下走的。

同样,我们也可以通过前台断点假如碰到一个函数就跳过去了,那它一定是回调函数。

通过回调函数的理解来进一步理解ajax及其注意的用法的更多相关文章

  1. js中回调函数(callback)的一些理解

    前言 我个人在学习Node.js相关知识时遇到了回调函数这个概念,虽然之前已经在c,c++等编程语言中用到过它,但还一直未对其机制有深入了解,这次就来好好谈一下它. 概念理解 百度对它的解释是回调函数 ...

  2. PHP 回调函数call_user_func和 call_user_func_array()的理解

    call_user_func(function,param); // 第一个参数是回调函数的函数名,第二个参数是参数 call_user_func函数类似于一种特别的调用函数的方法.其主要有以下的类型 ...

  3. ajax回调函数,全局变量赋值后,ajax外无法获取的解决

    1 ajax回调函数内,function的执行与ajax外是异步的,常导致全局变量赋值后,再次使用此变量人无法获取. 所以,可以把需要的步骤,独立放在functuon中,在ajax回调函数中执行.可较 ...

  4. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  5. [转]理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  6. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  7. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  8. 理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  9. 对c语言回调函数的理解

    对于回调函数,可以简单的理解为一种特别的函数调用方法,我们可以对比一下回调函数与普通函数在调用方法上的区别. 1. 普通函数调用 一般为实现方在其函数体执行过程中直接调用. 代码示例: #includ ...

随机推荐

  1. pug新手学习

    感觉自己有段时间没有跟新了,唉,只是一直找不到可以写的必要 其实我一直对pug特别感兴趣的,安装点我 记得全局安装pug和pug-cli就行了 在webstorm配环境记得在前面加-P a: img  ...

  2. 解决xshell评估期已过的问题

    问题:时间长没有打开xshell,今天突然打开提示评估期已过,如下图所示: 点击采购会弹出购买的界面,(对于我们这些程序屌怎么会花899购买一款软件)点击取消就会退出. 解决方法: 卸载这个要收费的版 ...

  3. qt安装--this Qt version uses an unsupported makefile

    解决办法: Run regedit. Hop to HKEY_CURRENT_USER\Software\Trolltech\Versions或HKEY_CURRENT_USER\Software\D ...

  4. Leetcode刷题C#版之Toeplitz Matrix

    题目: Toeplitz Matrix A matrix is Toeplitz if every diagonal from top-left to bottom-right has the sam ...

  5. redis 设置认证密码

    通过修改redis配置文件(redis.conf)修改验证密码.(重启生效) requirepass myRedis 客户端通过密码登录redis并进行操作 redis-cli -h 127.0.0. ...

  6. Linux ipip隧道及实现

    一.IP隧道技术 IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程.IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可 ...

  7. Sqlserver将数据从一张表插入到另一张表

    1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colum ...

  8. RAC节点两边存储名字不一致导致的故障及相关延伸

    起因:一个客户的实际故障,该故障非常典型,其他客户类似的环境也非常多,所以很值得梳理并记录下来. 环境:Oracle 11.2.0.4 RAC(2 nodes)+ RHEL 6.6 共享存储:EMC ...

  9. js中的回调函数

    1.你定义的 2.你没有调用 3.但是最终他执行了 例子: 定时器回调函数 setTimeout(function(){ },100); dom元素的回调函数 document.getElementB ...

  10. AVFoundation 框架初探究(四)

    叨叨两句 动手写这篇总结时候也是二月底过完年回来上班了,又开始新的一年了,今年会是什么样子?这问题可能得年底再回答自己了.在家窝了那么久,上班还是的接着看我们要看的东西,毕竟我们要做的事还真的太多的. ...