- 浏览: 525337 次
- 性别:
- 来自: 北京
-
博客专栏
-
-
jQuery技术内幕
浏览量:202619
最新评论
-
青春依旧:
学习html5哪里好?当然华清远见是首选!
[原创] jQuery源码分析-01总体架构 -
追梦1819:
[size=x-small][color=red][/colo ...
[原创] jQuery源码分析-04 选择器-Sizzle-设计思路 -
niuqiang2008:
学习学习
[原创] jQuery源码分析-04 选择器-Sizzle-工作原理 -
liuweihug:
jquery 解析正则表达式及常见的Regex规则和表达式 - ...
[原创] jQuery源码分析-02正则表达式-RegExp-常用正则表达式 -
liang8768:
mark!!!
[原创] jQuery源码分析-00前言开光
1. 总体架构
1.1 自调用匿名函数 self-invoking anonymous function
打开jQuery源码,首先你会看到这样的代码结构:
(function( window, undefined ) { // jquery code })(window); |
1. 这是一个自调用匿名函数。什么东东呢?在第一个括号内,创建一个匿名函数;第二个括号,立即执行
2. 为什么要创建这样一个“自调用匿名函数”呢?
通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个JS框架必须支持的功能,jQuery被应用在成千上万的JavaScript程序中,必须确保jQuery创建的变量不能和导入他的程序所使用的变量发生冲突。
3. 匿名函数从语法上叫函数直接量,JavaScript语法需要包围匿名函数的括号,事实上自调用匿名函数有两种写法(注意标红了的右括号):
(function() { console.info( this ); console.info( arguments ); }( window ) ); |
(function() { console.info( this ); console.info( arguments ); })( window ); |
4. 为什么要传入window呢?
通过传入window变量,使得window由全局变量变为局部变量,当在jQuery代码块中访问window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window;这还不是关键所在,更重要的是,将window作为参数传入,可以在压缩代码时进行优化,看看jquery-1.6.1.min.js:
(function(a,b){})(window); // window 被优化为 a |
5. 为什么要在在参数列表中增加undefined呢?
在 自调用匿名函数 的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值。
undefined = "now it's defined"; alert( undefined ); |
浏览器测试结果:
浏览器 |
测试结果 |
结论 |
ie |
now it's defined |
可以改变 |
firefox |
undefined |
不能改变 |
chrome |
now it's defined |
可以改变 |
opera |
now it's defined |
可以改变 |
6. 注意到源码最后的分号了吗?
分号是可选的,但省略分号并不是一个好的编程习惯;为了更好的兼容性和健壮性,请在每行代码后加上分号并养成习惯。
1.2 总体架构
接下来看看在 自调用匿名函数 中都实现了什么功能,按照代码顺序排列:
(function( window, undefined ) { // 构造jQuery对象 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); } // 工具函数 Utilities // 异步队列 Deferred // 浏览器测试 Support // 数据缓存 Data // 队列 queue // 属性操作 Attribute // 事件处理 Event // 选择器 Sizzle // DOM遍历 // DOM操作 // CSS操作 // 异步请求 Ajax // 动画 FX // 坐标和大小 window.jQuery = window.$ = jQuery; })(window); |
从上边的注释看,jQuery的源码结构相当清晰、条理,不像代码那般晦涩和让人纠结。
后边的章节基本将以这个顺序展开。
1.3 下节预告
如果你看过jQuery源码,很快就会发现这里到处充斥着正则表达式,而很多JavaScript开发人员又疏于正则基础知识,为了扫清这个障碍,下一章将先温习JavaScript正则表达式的基础知识,再详细剖析jQuery中的正则表达式。
在正式开始分析源码之前,还有没有要准备的基础知识呢?
当然有。比如JavaScript API中的类和对象,如果你不熟练的话,至少手头要有一本参考手册。
除了正则,其他的知识点会在分析过程中穿插讲解,不计划辟出新的章节。
评论
<script> $(function(){ window.test = function(){ alert('test'); }; }); // ok $(function(){ test(); }); // fail (function(){ window.test(); })(); // fail $(function(w){ w.test(); }(window)); // fail (function(w){ w.test(); })(window); </script>
三个fail是因为它们执行时,window.test = function(){...}还没有执行,如果这句先执行过了,就都正常执行了
init: function( selector, context, rootjQuery ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } }这不应该是个对象么
如:var module1 = (function(){
_count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
alert(module1._count);---输出undefined
可不可以这样理解。因为你的module1是自执行函数为其赋的值。而这个自执行函数执行后返回值为仅仅包含m1、m2变量的对象。你使用 alert出 module1这个已经赋值过的对象中找_count当然不能找到了。不知道可不可以这样理解……
刚刚引错了。。应该是这个。。_count是全局变量吧。。。
基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
你传递的obj指针是按值传递的,函数调用结束后obj还指向调用前的obj
是不是因为_count成为了全局变量啊。。。console.log(_count)就可以。。


基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
var dog = new Object(); dog 是一个引用,指向一块内存,将dog传入setName,在setName中修改name属性,能直接反应到dog中,对传入的引用重新赋值,让它重新指向另外一个区域,然后修改name属性,因为引用重置了,这个修改只会对内部那个新对象有用,对外部的dog已无影响。
引用《javascript高级程序设计》书中的一句话回答:当在函数内部重写引用对象obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即销毁。
可以把ECMAScript函数的参数想想成局部变量。
基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
var dog = new Object(); dog 是一个引用,指向一块内存,将dog传入setName,在setName中修改name属性,能直接反应到dog中,对传入的引用重新赋值,让它重新指向另外一个区域,然后修改name属性,因为引用重置了,这个修改只会对内部那个新对象有用,对外部的dog已无影响。
请教个问题 jquery $(selector)方法 $.trim()
jquery 即使方法也是对象
怎么做到的?
这块很不理解 劳烦 博主解答!
查看jQuery1.6.4源代码如下:
(function( window, undefined ) {
// Use the correct document accordingly with window argument (sandbox)
var document = window.document,
navigator = window.navigator,
location = window.location;
.......
该trim函数是通过jQuery的extend方法实现继承的。这就需要你理解jQuery.extend的功能了。
不知道说的这么多你理解否?
多谢楼主解答,醍醐灌顶呀
<script> $(function(){ window.test = function(){ alert('test'); }; }); // ok $(function(){ test(); }); // fail (function(){ window.test(); })(); // fail $(function(w){ w.test(); }(window)); // fail (function(w){ w.test(); })(window); </script>
请教个问题 jquery $(selector)方法 $.trim()
jquery 即使方法也是对象
怎么做到的?
这块很不理解 劳烦 博主解答!
查看jQuery1.6.4源代码如下:
(function( window, undefined ) {
// Use the correct document accordingly with window argument (sandbox)
var document = window.document,
navigator = window.navigator,
location = window.location;
var jQuery = (function() {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},
......
return jQuery;//返回的这个就是var jQuery = function( selector, context ) {}
})();
......
window.jQuery = window.$ = jQuery;
})(window);
//解决你的问题1. $(selector)
调用的是如下代码:
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
}//说到最后还是 new 了jQuery.fn.init的一个实例,使用selector作为参数。
//解决你的问题2. $.trim()
// Use native String.trim function wherever possible
jQuery.extend({
......
trim: trim ?
function( text ) {
return text == null ?
"" :
trim.call( text );
} :
// Otherwise use our own trimming functionality
function( text ) {
return text == null ?
"" :
text.toString().replace( trimLeft, "").replace( trimRight, "" );
},
......});
该trim函数是通过jQuery的extend方法实现继承的。这就需要你理解jQuery.extend的功能了。
不知道说的这么多你理解否?
基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
你传递的obj指针是按值传递的,函数调用结束后obj还指向调用前的obj
在函数setName内部给obj参数添加了一个属性name、然后将引用变量obj重新赋值为空对象。这个obj的重新定义只是在函数内部起到效果、函数之外obj还是指向原来的地址。所以输出:xiaobai。我可以这样解释吗?
请教个问题 jquery $(selector)方法 $.trim()
jquery 即使方法也是对象
怎么做到的?
这块很不理解 劳烦 博主解答!
基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
你传递的obj指针是按值传递的,函数调用结束后obj还指向调用前的obj
如:var module1 = (function(){
_count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
alert(module1._count);---输出undefined
可不可以这样理解。因为你的module1是自执行函数为其赋的值。而这个自执行函数执行后返回值为仅仅包含m1、m2变量的对象。你使用 alert出 module1这个已经赋值过的对象中找_count当然不能找到了。不知道可不可以这样理解……
如:var module1 = (function(){
_count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
alert(module1._count);---输出undefined
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
obj是dog的一个复制,所以修改obj指向别的对象对dog没影响。
基本类型按值传递,对象传入引用,函数内部的 window 即全局 window。
看这样一个例子
<script type="text/javascript"> function setName(obj){ obj.name = "xiaobai"; obj = new Object(); obj.name = "xiaohei"; } var dog = new Object(); setName(dog); console.log(dog.name); /*输出 *xiaobai */ </script>
JS的函数传参应该都是传值吧,即使是一个对象作为参数,也只是传递的这个对象的引用的一个复制。难道我理解错了??
这个还真没想到


发表评论
-
[原创] jQuery源码分析-04 选择器-Sizzle-设计思路
2011-11-14 20:59 6971作者:nuysoft/高云 QQ:47214707 Em ... -
[原创] jQuery源码分析-04 选择器-Sizzle-工作原理
2011-11-13 23:45 8011作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-02正则表达式-RegExp-常用正则表达式
2011-10-27 01:29 46816作者:nuysoft/JS攻城师/ ... -
[原创] jQuery源码分析-jQuery中的循环技巧
2011-10-27 00:36 14665作者:nuysoft/JS攻城师/高云 QQ:47214707 ... -
[原创] jQuery源码分析-10事件处理-Event-DOM-ready
2011-10-20 01:20 10745作者:nuysoft/JS攻城师/ ... -
[原创] jQuery源码分析-Java工程师应该向jQuery学习的8点建议
2011-10-18 23:56 12419作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/undelegate
2011-10-18 22:31 15792作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-10事件处理-Event-源码结构
2011-10-17 01:01 12269作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析-07数据缓存-Cache
2011-10-13 19:55 12270作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析-06浏览器测试-Support
2011-10-13 19:19 10074作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析系列目录(持续更新)
2011-10-12 12:30 29513作者:nuysoft/高云 QQ:47214707 E ... -
[原创] jQuery源码分析-10事件处理-Event-概述和基础知识
2011-10-12 00:16 12139作者:nuysoft/高云 Q ... -
[原创] jQuery源码分析-08队列 Queue
2011-10-10 23:48 10935作者:nuysoft/高云 Q ... -
[原创] jQuery源码分析-03构造jQuery对象-工具函数
2011-09-29 23:21 29927作者:nuysoft/高云 QQ:47214707 E ... -
[原创] jQuery源码分析-15AJAX-类型转换器
2011-09-29 02:25 7559作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011-09-28 02:20 53132作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析-如何做jQuery源码分析
2011-09-27 00:22 15148近期在ITEYE陆续写了几篇jQuery源码分析,乐在其 ... -
[原创] jQuery源码分析-17尺寸和大小 Dimensions & Offset
2011-09-25 22:05 7155边读边写,不正确的地方,还请各位告诉我,多多交流共同学习, ... -
[原创] jQuery源码分析-15AJAX-前置过滤器和请求分发器
2011-09-23 00:09 13418边读边写,不正确的 ... -
[原创] jQuery源码分析-00前言开光
2011-09-21 23:42 47156jQuery源码分析 - 前言 jQuery凭借简洁的语法和 ...
相关推荐
这是一个基于Java技术栈的时装原创设计交流网络平台的毕业设计项目。该项目采用了SSH(Spring、Struts2、Hibernate)框架,结合MySQL数据库进行数据存储,实现了完整的前后端功能,包括用户交互、数据处理和界面展示...
计算机硬件控制_驱动级键盘鼠标同步_PS2接口UDP协议多机协同_基于rabirdwinio和pynput的跨设备输入共享系统_实现多台Windows电脑的键盘鼠标同步操作_支持
嵌入式八股文面试题库资料知识宝典-TCPIP协议栈.zip
少儿编程scratch项目源代码文件案例素材-开膛手杰克.zip
基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现
内容概要:本文详细探讨了电力弹簧技术在主动配电网规划及运行优化调度中的应用。首先介绍了电力弹簧技术作为智能电网调控手段的优势,如自适应性强、响应速度快、节能环保等。接着阐述了主动配电网规划的目标和策略,包括优化电网结构、提高能源利用效率和降低故障风险。随后讨论了运行优化调度的原则和方法,强调了实时监测、智能调度策略以及优化调度模型的重要性。最后通过实际案例分析展示了电力弹簧技术在提升电网稳定性、可靠性和能效方面的显著效果,展望了其广阔的应用前景。 适合人群:从事电力系统规划、运行管理的研究人员和技术人员,以及对智能电网感兴趣的学者和学生。 使用场景及目标:适用于希望深入了解电力弹簧技术及其在主动配电网规划和运行优化调度中具体应用的专业人士。目标是掌握电力弹簧技术的工作原理、优势及其在实际项目中的实施方法。 其他说明:本文不仅提供了理论分析,还有具体的案例支持,有助于读者全面理解电力弹簧技术的实际应用价值。
嵌入式八股文面试题库资料知识宝典-C语言思维导图.zip
电路教学与科研案例的结合—以最大功率传输定理为例.pdf
内容概要:本文深入介绍了HarmonyOS文件系统及其在万物互联时代的重要性。HarmonyOS自2019年发布以来,逐步覆盖多种智能设备,构建了庞大的鸿蒙生态。文件系统作为其中的“数字管家”,不仅管理存储资源,还实现多设备间的数据协同。文章详细介绍了常见的文件系统类型,如FAT、NTFS、UFS、EXT3和ReiserFS,各自特点和适用场景。特别强调了HarmonyOS的分布式文件系统(hmdfs),它通过分布式软总线技术,打破了设备界限,实现了跨设备文件的无缝访问。此外,文章对比了HarmonyOS与Android、iOS文件系统的差异,突出了其在架构、跨设备能力和安全性方面的优势。最后,从开发者视角讲解了开发工具、关键API及注意事项,并展望了未来的技术发展趋势和对鸿蒙生态的影响。 适合人群:对操作系统底层技术感兴趣的开发者和技术爱好者,尤其是关注物联网和多设备协同的用户。 使用场景及目标:①理解HarmonyOS文件系统的工作原理及其在多设备协同中的作用;②掌握不同文件系统的特性和应用场景;③学习如何利用HarmonyOS文件系统进行应用开发,提升跨设备协同和数据安全。 阅读建议:本文内容详实,涵盖了从基础概念到高级开发技巧的多个层次,建议读者结合自身需求,重点关注感兴趣的部分,并通过实践加深理解。特别是开发者可参考提供的API示例和开发技巧,尝试构建基于HarmonyOS的应用。
嵌入式八股文面试题库资料知识宝典-海康嵌入式笔试题.zip
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
基于环比增长的销售统计分析——2019年中青杯全国数学建模竞赛C题.pdf
嵌入式八股文面试题库资料知识宝典-linux面试题.zip
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
内容概要:本文探讨了小电流接地系统在配电网络中的应用,特别是在单相故障情况下的仿真分析。文中介绍了小电流接地系统的背景和发展现状,重点讨论了两种常见的接地方式——中性点不接地和中性点经消弧线圈接地。利用Matlab作为仿真工具,作者构建了详细的电路模型,模拟了单相故障的发生过程,并通过多个结果图表展示了故障电流、电压波形及系统运行状态。此外,文章还包括了详细的设计说明书和PPT介绍,帮助读者全面理解仿真过程和技术细节。 适合人群:从事电力系统研究、维护的技术人员,尤其是关注配电网络安全和稳定的工程师。 使用场景及目标:适用于希望深入了解小电流接地系统的工作原理和故障处理机制的专业人士。通过本研究,读者可以掌握如何使用Matlab进行电力系统仿真,评估不同接地方式的效果,优化配电网络的安全性能。 其他说明:随文附带完整的仿真工程文件、结果图、设计说明书及PPT介绍,便于读者进一步探索和实践。
少儿编程scratch项目源代码文件案例素材-激烈的殴斗.zip
嵌入式八股文面试题库资料知识宝典-小米嵌入式软件工程师笔试题目解析.zip
内容概要:本文详细探讨了车辆主动避撞技术中的两种常见策略——纵向紧急制动避撞和横向紧急转向避撞。首先介绍了这两种避撞策略的基本概念,接着深入分析了临界纵向安全距离的概念及其对避撞模式选择的影响。文中特别强调了五次多项式换道轨迹模型在计算横向紧急转向避撞安全距离中的应用。最后,通过一个简化的程序实现了避撞策略的模拟和可视化展示,帮助读者更好地理解不同避撞方式的应用场景和技术细节。 适合人群:汽车工程技术人员、交通安全研究人员、自动驾驶开发者。 使用场景及目标:适用于研究和开发车辆主动避撞系统的专业人士,旨在提高对避撞策略的理解,优化避撞算法的设计,提升行车安全性。 其他说明:文章不仅提供了理论分析,还结合了具体的数学模型和程序实现,使读者能够从多个角度全面掌握车辆避撞技术的关键要素。
基于MPPSK调制的数字对讲机系统.pdf
嵌入式八股文面试题库资料知识宝典-Nec试题回忆二.zip