假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击
一,再一次理解回调函数
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
在这里我们注意了
copyOffset:function(index){
return {x:-index,y:-2 * index}; }就是一个回调函数,当代吗执行到
39行时,在这里并没有往return {x:-index,y:-2 * index};这行代码走,在这里只是一个赋值的过程,这时候代码会继续往下走,走到alert("先于copyOffset函数执行的");这一行的,至于什么时候执行alert("我被执行了");就是回调函数执行完了之后在执行的但是它一定是在 先于copyOffset函数执行的 之后执行的。
至于回调函数里面的执行规律请见
二,理解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){}类似这种的情况断点就会直接跳过去的,假如在后台打断点的时间足够多的话就不会跳过去,一般情况下都会跳过去的,这就是回调函数的原因当执行到这一行的时候只是赋值的过程,而回调的函数还没有返回要求的值的,这时候就有点类似与多线程就会往下走的。
同样,我们也可以通过前台断点假如碰到一个函数就跳过去了,那它一定是回调函数。