假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html
一,再一次理解回调函数
1 (function($){ 2 $.fn.shadow = function(opts){ 3 //定义的默认的参数 4 var defaults = { 5 copies: 5, 6 opacity:0.1, 7 //回调函数 8 copyOffset:function(index){ 9 return{x:index,y:index}; 10 } 11 }; 12 //将opts的内容合并到default中。 13 var options = $.extend(defaults,opts); 14 return this.each(function(){ 15 var $originalElement = $(this); 16 //设置参数对象 17 for(var i=0;i<options.copies;i++) 18 { 19 var offset = options.copyOffset(i); 20 $originalElement 21 .clone() 22 .css({ 23 position:'absolute', 24 left:$originalElement.offset().left + offset.x, 25 top:$originalElement.offset().top + offset.y, 26 margin:0, 27 zIndex:-1, 28 //设置参数对象 29 opacity:options.opacity 30 }) 31 .appendTo('body'); 32 } 33 }); 34 }; 35 })(jQuery); 36 $(document).ready(function(){ 37 $('h1').shadow({ 38 copies:5, 39 copyOffset:function(index){ 40 alert("我被执行了"); 41 return {x:-index,y:-2 * index}; 42 } 43 alert("先于copyOffset函数执行的"); 44 }); 45 });
在这里我们注意了
copyOffset:function(index){
return {x:-index,y:-2 * index};
}
就是一个回调函数,当代吗执行到
39行时,在这里并没有往return {x:-index,y:-2 * index};这行代码走,在这里只是一个赋值的过程,这时候代码会继续往下走,走到alert("先于copyOffset函数执行的");这一行的,至于什么时候执行alert("我被执行了");就是回调函数执行完了之后在执行的但是它一定是在 先于copyOffset函数执行的 之后执行的。
至于回调函数里面的执行规律请见
jquery回调函数的一个案例
二,理解ajax
反面案例
1 $(document).ready(function(){ 2 $('#txt').val('000000');//给文本框初始值 3 $('#btn01').bind('click',function(){ 4 $.ajax({ 5 type: "POST", 6 url: "<%=request.getContextPath() %>/vumssmer/vmerservice!studyCallBack.do", 7 data:'', 8 success:function(msg){ 9 console.log('msg.vflag:' + msg.vflag); 10 console.log('msg.vmsg:' + msg.vmsg); 11 $('#txt').val(msg.vflag); 12 outerdata = msg.vflag; 13 } 14 }); 15 if (outerdata == 'true'){ 16 console.log('文本框内容是:' + $('#txt').val()); 17 console.log('公共变量的值是:' + outerdata); 18 console.log('yes'); 19 }else{ 20 console.log('文本框内容是:' + $('#txt').val()); 21 console.log('公共变量的值是:' + outerdata); 22 console.log('no'); 23 } 24 }); 25 });
所谓的ajax就是异步的,它的定义是在不刷新页面的情况下,来动态的修改数据,或者说去查数据库,
这里最关键的就是ajax中应用了回调函数的原因,单代码走到 success:function(msg){}这一步的时候,存储的函数是不会被调用的,因为这只是一个赋值操作。就会直接跳过这个方法体里面的信息而,直接往下走,执行方法体外面的代码,
这时候当多线程执行完success:function(msg)会把值赋值到里面去的,至于什么时候执行完就要看ajax配置的url里面的代码处理量的大小了。
这样的好处有:
(1)可以让实现方,根据回调方的多种形态进行不同的处理和操作。(ASIHttpRequest)
(2)可以让实现方,根据自己的需要定制回调方的不同形态。(UITableView)
(3)可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。
(4)让代码的逻辑更加集中,更加易读。
Ajax里的回调函数只是我们赋值给XMLHttpRequest对象的回调函数,它的执行和我们所写的调用ajax函数无关。
实际运用中如果我们想在执行完ajax请求后,根据请求结果执行相关的逻辑,那么请把逻辑写在ajax的回调函数里,只有这样才能让代码按业务逻辑正常运行。
所以通过上面的分析我们可以得出答案,当我们要用ajax返回的值时,一定要把处理的方法写在ajax方法里面来。而不是像上面的案例那样。
如果想详细的理解ajax和回调函数请见,
所以我们有时候可以看到当在前台打断点的时候,一旦碰到success:function(msg){}类似这种的情况断点就会直接跳过去的,假如在后台打断点的时间足够多的话就不会跳过去,一般情况下都会跳过去的,这就是回调函数的原因当执行到这一行的时候只是赋值的过程,而回调的函数还没有返回要求的值的,这时候就有点类似与多线程就会往下走的。
同样,我们也可以通过前台断点假如碰到一个函数就跳过去了,那它一定是回调函数。