jQuery 有 ajax 的支持,我应用的情况是:需要在ajax请求的对象中附加自己的数据
本来jQuery ajax 方法中要传递的对象都是事先规划好的,每一个参数都有jQuery的操作意义,如果在应用中需要附加自己的参数,当然要命名新的KEY,比如:伪代码
jQuery.ajax({MyData:mydata,其他jqueryajax参数})
这里的MyData参数就是自己应用中需要传递的参数对象,且不讨论要传送什么,这个需求有可能有的。
问题:
如果这个MyData的对象是一个复杂的含有循环引用的对象的话,有可能造成与jQuery ajax 方法内部实现的冲突。
因为在jQuery ajax 内部实现中对ajax的参数对象进行了深度的扩展,我们知道javascript的深度扩展实现中要避免循环引用的状况,这种情况会造成死递归循环发生,这一点看jQuery的ajax实现代码就可以知道问题所在:
ajax: function( s ) { // Extend the settings, but re-extend 's' so that it can be // checked again later (in the test suite, specifically) var MyData=s.MyData;//改造后的代码 if(MyData) delete s.MyData;//改造后的代码 s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); if(MyData) s.MyData=MyData;//改造后的代码 //........省略 }
可见如果是循环引用的参数附加到ajax方法中必定造成extend的死循环。通过改造后,可以避免这一状况的发生。
开源就是有这点优势。
备注:
这完全是笔者省事的做法,如有其它更标准的方法请明示