很多人觉得jquery、ext等一些开源js源代码 十分的晦涩,读不懂,遇到问题需要调试也很费劲。其实我个人感觉主要是有几个方面的原因:
1、对一些js不常用的语法、操作符不熟悉
2、某个function中又嵌套了一些内部的function,使得整个代码的层次结构不像java代码那么清晰。
3、js中允许变量先使用后定义,会造成我们看代码时候忽然冒出来一个变量、function,却找不到是在哪里定义的。
那么今天给大家分享一下我的经验,扫清你的障碍。
一、一些晦涩的操作符:
1、(function(){})();
几乎所有的开源js代码开篇都是这样(function(……){……})(……);
下面是Jquery的部分源码:
-
(function
( window, undefined ) {
-
var
jQuery = function
( selector, context ) {
-
-
return
new
jQuery.fn.init( selector, context );
-
},
-
-
-
_jQuery = window.jQuery,
-
-
-
_$ = window.$,
-
……
-
indexOf = Array.prototype.indexOf;
-
-
-
window.jQuery = window.$ = jQuery;
-
})(window);
那么这个操作符(function(){})();到底是什么意思呢?
(function(){})中的定义了一个function,紧接着的()表示立即执行这个function。
我们看到Jquery源码第一个()中是定义了一个匿名function( window, undefined ) {};接着末尾有个(window),就表示执行这个匿名function,并传入参数window。
在
匿名function( window, undefined )
{}中,定义了一个局部变量jQuery;然后在末尾我们看到Jquery末尾有一句 window.jQuery = window.$ =
jQuery;
这句代码就表示,将此前定义的jQuery导出到window对象。这也是为什么我们可以在代码任何地方直接使用$、jQuery对象,因为在这里已经
将$、jQuery对象挂载到window下去了,而window.$、window.jQuery与直接使用$、jQuery是没有区别的。
(注
意,这个window对象是传入的参数window,而不是浏览器window对象!!一个形参、一个实参。我们可以在定义function的时候,将参
数window取名为其他字符。所以我们看到jquery.min.js中这个匿名function变成了(function(E,B){})
(window);)
通常(function(){})()用来封装一些私有成员或者公共成员的导出。
2、令人迷惑的","
我们知道“,”一般用于一次定义多个变量、定义多个参数等。像上面的jQuery源码中在var jQuery后面,使用“,”一次定义了很多个变量。
但是,像下面的代码,可能大家就不一定看得懂了:
-
-
jQuery(document).ready(function
() {
-
var
showName=function
(){
-
var
value,nameInput=$("#nameHide"
);
-
return
nameInput.show(),value=nameInput.val();
-
};
-
alert(showName());
-
});
-
这
里的“nameInput.show(),value=nameInput.val()”中的“,”运算符的作用是返回","右侧表达式的值。所
以,return 后面如果有多个表达式,且表达式之间由","隔开,整个return表达式返回的是最后一个","右侧的表达式的值。
“,”在开源代码中常常被用于return表达式中,以及跟下面我们要讲到的"()"运算符一起使用。
3、“()”广义上的代码包装
我们遇到复杂的逻辑表达式时,我们通常会把需要一起运算的表达式用“()”包起来:(a||b)&&(c||d)
其实,我们可以这样理解:"()"运算符将一个表达式包裹起来作为一个整体进行运算,然后返回这个整体的值。
那
么上面的(function(){})()中左侧定义function的()也是这个作用,将这个function给包裹起来,然后返回这个
function。我们调用方法一般是a();那么(function(){})的作用就是返回这个function对象,然后(function()
{})()右侧的()表示调用这个function。
我们再来看其他的用法:
-
-
jQuery(document).ready(function
() {
-
var
nameValidate=function
(){
-
var
value,nameInput=$("#name"
),nameErrorTip=$("#nameErrorTip"
);
-
return
(value=nameInput.val(),value=="king"
)?(nameErrorTip.hide(),"对了,输入为king!"
):(nameErrorTip.show(),"请输入king!"
);
-
};
-
alert(nameValidate());
-
});
-
-
-
-
-
-
-
这里“ (value=nameInput.val(),value=="king")”中"()"将里面的表达式作为一个整体进行运算,而里面的表达式又是由","构成的多个表达式组,所以执行的时候会把这多个表达式都执行一次
,并且返回最后一个表达式的值!
所
以 (value=nameInput.val(),value=="king")执行时,先运算value的值,再判断是否为"king"。如果为
king,会执行(nameErrorTip.hide(),"对了,输入为king!")。这个表达式又先将nameErrorTip隐藏,再返回一
个"对了,输入为king!"字符串作为 整个return的值。
4、||、&&、if()逻辑让人头晕
||、&&两侧参与运算的是逻辑表达式,if()中也是。但是我们在很多开源代码中看到的||、&&参与运算的表达式看起来却好像不是逻辑表达式……
下面节选一段jQuery.tool中的一段源码:
-
e.circular || (f.onBeforeSeek(function
(a, b) {
-
setTimeout(function
() {
-
a.isDefaultPrevented()
-
|| (n.toggleClass(e.disabledClass,
-
b <= 0), o.toggleClass(
-
e.disabledClass, b >= f
-
.getSize()
-
- 1))
-
}, 1)
-
}), e.initialIndex || n.addClass(e.disabledClass)), f.getSize() < 2
-
&& n.add(o).addClass(e.disabledClass), e.mousewheel
-
&& a.fn.mousewheel && b.mousewheel(function
(a, b) {
-
if
(e.mousewheel) {
-
f.move(b < 0 ? 1 : -1, e.wheelSpeed || 50);
-
return
!1
-
}
-
});
这里有多处||、&&。但与运算的表达式却是调用某个函数的返回值。
其实,js中的逻辑表达式是按照真值、假值来分的。true是真值;1是真值;一个对象也是真值;false是假值;""、0是假值。
在js中&&、||不一定都是用来判断一个表达式的逻辑值是true、false,更多的是用来依据真值或者假值执行相应操作!
我们知道,||运算的时候,会先运算左侧的表达式的值,如果为真值,那么真个表达式就为真值,而同时右侧表达式是真值、假值都不重要,因为右侧表达式都不再继续参与运算了。又如果左侧为假值,则继续运算右侧表达式。
&&则先运算左侧表达式,两侧表达式,一个为假值,则整个表达式为假值。
这
里关键是这个真值或者假值的运算过程中,我们可以使用上面介绍的","、"()"将一组表达式串起来执行。也就是说,这个表达式可能会很长很长,我甚至可
以定义一个function在里面。这些表达式在执行过程中,有可以进行某些附加操作。比如我们希望这个表达式为真值的时候我们做什么,假值的时候做什
么,把这些操作用"()"、","串起来作为一个整体运算。
于是就有了上面的复杂代码。
另外,大家注意:下面的几种写法是等价的:
-
if
(a){
-
b
-
}
-
-
a&&(b)
-
-
-
if
(a){
-
b
-
}else
{
-
c
-
}
-
-
(a&&(b))||c
-
我们来看个实例吧。是上面例子的升级版。我们加入一个nameInput是否存在的判断:
-
jQuery(document).ready(function
() {
-
var
nameValidate=function
(){
-
var
value,nameInput=$("#name"
),nameErrorTip=$("#nameErrorTip"
),msg;
-
msg=(value=nameInput.val(),value=="king"
)?(nameErrorTip.hide(),"对了,输入为king!"
):(nameErrorTip.show(),"请输入king!"
);
-
return
(nameInput.length&&nameInput.val()&&nameErrorTip.length&&msg)||"没有找到name输入框或者输入框没有值!"
;
-
};
-
alert(nameValidate());
-
});
测试:
return
表示
中 nameInput.length&&nameInput.val()&&nameErrorTip.length&&msg
会先运算 nameInput.length的值,如果length为0则表达式为假值,如果为1则为真值。val()操作也是如此,如果val()结果
为""则表达式也是假值。几个表达式之间为&&运算,则表示依次运算几个表达式的值,如果都未真值则返回最后一个表达式的值
,由于整个表达式与
"没有找到name输入框或者输入框没有值!"
表达式之间是||运算,所以前面的表达式其中一个表达式为假值则返回||右侧的表达式的值,也就是整个“没有找到name输入框或者输入框没有值!”字符串。
说到这里,我之前写过一篇文章专门说到了&&、||的真值、假值问题。有兴趣的可以去看看。http://my249645546.iteye.com/blog/1553202
谈了这些难以理解的运算符后,大家可能会觉得,这个javascript为什么要搞这些晦涩的运算符呢?
我的理解是因为javascript通常在客户端运行,那么从服务器端将js代码传输到客户端肯定需要耗时。上面的这些运算符都是为了减少代码量。再加上使用压缩工具去掉空格,替换变量名,就可以使用压缩率达到最好。
分享到:
相关推荐
【标题】"ThinkPHP框架源码交易系统资源网站源码"揭示了这是一个基于ThinkPHP框架构建的用于在线交易源码的网站系统。ThinkPHP是中国较受欢迎的PHP开发框架,它提供了一个快速、稳定且易于扩展的开发环境。该框架...
总的来说,XUI js框架源码是一个完整的前端解决方案,包括了前端开发所需的各种元素,适合希望深入理解JavaScript框架,或者需要快速构建富客户端应用的开发者。通过学习和使用这个框架,开发者不仅可以提升开发技能...
《深入剖析H+框架源码》 H+框架,作为一个高效、灵活的前端开发框架,深受开发者喜爱。它集成了现代Web开发的诸多特性,旨在简化网页应用的构建过程,提高开发效率。本文将深入探讨H+框架的核心原理,解析其源码,...
PHP通用后台开发框架源码数据库 MySQL源码类型 WebForm 随着互联网技术的发展,后台管理系统在网站和移动应用中扮演着重要的角色。一套高效的后台开发框架能够帮助开发者快速构建后台管理功能,提高开发效率并减少...
SmartClient JavaScript框架是一款强大的富客户端应用开发工具,它提供了丰富的组件库、数据绑定机制和高度可定制的界面,使得开发者可以构建高性能、交互性强的Web应用程序。源码分析是理解框架内部工作原理的关键...
在"html左右侧框架源码"中,左侧菜单通常使用`<ul>`和`<li>`元素构建一个层次结构,可能结合JavaScript或jQuery实现动态展开与折叠的效果,以便于展现树形架构。为了实现交互性,开发者可能会使用事件监听(如`click...
安卓手机云控系统框架源码解析:PHP+Autojs组合的空框架源码,支持ws+http通信协议,二次开发之选,安卓手机云控系统框架源码解析:PHP+Autojs实现,ws+http通信协议,源头作者出品,适用于二次开发,安卓手机云控系统...
本资源提供了一套基于ThinkPHP和Bootstrap的极速后台开发框架设计源码,名为FastAdmin。该框架开源且可免费商用,内置了基于Auth验证的权限管理系统,并支持一键生成CRUD功能。项目包含550个文件,其中166个LESS样式...
而Vue.js、Angular.js和React.js则是JavaScript的前端框架,它们封装了处理状态、渲染视图、组件化开发等复杂逻辑,使开发者更专注于业务逻辑而非基础架构。 “源码”通常指的是软件的原始代码,对于学习和理解系统...
这个名为"jeecg开源框架源码.zip"的压缩包包含了Jeecg框架的核心源代码,主要文件夹为"jeecg-master",这通常是项目的主要根目录。 Jeecg框架的设计理念是“简单、高效”,旨在降低企业级应用的开发复杂度,提高...
在"jQuery.easyui框架源码"中,我们可以深入理解其工作原理和内部机制。 首先,jQuery.easyui是建立在jQuery库的基础上的,这意味着它利用了jQuery的强大选择器、DOM操作和事件处理能力。jQuery本身简化了...
JavaScript框架高级编程 代码 code 源码
JavaScript框架源码是一种为了简化网页应用开发而设计的工具,它提供了一套预先定义好的结构和功能,使得开发者可以更高效、更规范地编写JavaScript代码。这个特定的框架以面向对象编程为基础,融合了继承机制,同时...
Java若依框架是一款基于SpringBoot的现代化权限管理框架,它为开发者提供了易读易懂的源码和简洁美观的用户界面。此框架的核心技术栈主要包括Spring、MyBatis以及Shiro,这使得它具备轻量级特性,无需依赖过多的第三...
【标题】"JS网页表白框架源码.rar"揭示了这个压缩包内容主要是一个JavaScript实现的网页表白框架。这种框架通常包含一系列的JavaScript代码、CSS样式和可能的图像资源,用于在网页上创建浪漫且吸引人的表白场景。...
5. **Vue.js**:渐进式JavaScript框架,简洁易用,适合各种规模的项目。源码分析有助于理解响应式系统和指令系统的设计。 6. **Node.js**:基于Chrome V8引擎的JavaScript运行环境,用于服务器端开发。学习Node.js...
【Java前端框架源码解析】 Java前端框架是用于构建用户界面和交互的工具,它结合了JavaScript、CSS和HTML这三种核心技术,以提高开发效率和优化用户体验。在本主题中,我们将深入探讨基于这些技术的前端框架源码,...
此源码包名为".net前端界面框架源码20170808",可能包含了一套特定日期(2017年8月8日)的.NET前端开发框架的完整代码,对于开发者来说,这是一份宝贵的学习和参考材料。 首先,.NET框架是由微软开发的一种软件框架...
本文档内容涉及一个基于JavaScript技术构建的xadmin后台管理框架设计源码,该项目是后台开发领域中的一项重要资源,具有很高的实用价值和参考意义。项目包含了129个不同类型的文件,涉及多个领域的知识和技术,如...