《基于Node.js的小型框架设计与实现毕业设计.doc》由会员分享,可在线阅读,更多相关《基于Node.js的小型框架设计与实现毕业设计.doc(62页珍藏版)》请在三一办公上搜索。
1、计算机科学与技术学院毕业设计(论文)论文题目基于Node.js的小型框架设计与实现指导教师x职 称x学生姓名x学 号x专 业x班 级x系 主 任x院 长x起止时间2012年11月25日至2013年6月6日2013年6月6日目录第一章 绪论51.1 node.js介绍51.2 node.js平台的优势领域61.3 node.js平台的非擅长领域81.4 开发框架的原因101.5开发框架存在的问题111.6本章小结12第二章 开发工具及技术综述122.1使用工具简介132.1.1 文本编辑器Vim132.1.2 git简介152.1.3 javascrip高级语言特性172.2使用平台简介212.
2、2.1 GitHub简介212.2.2 Ubuntu 简介222.3开源协议介绍222.3.1 BSD开源协议222.3.2 Apache Licence 2.0232.3.3 GPL(GNU General Public License)232.3.4 LGPL(GNU Lesser General Public License)232.3.5 MIT242.4 node.js开发环境搭建242.5 本章小结26第三章 框架的设计与实现263.1框架概述263.2开发环境273.2.1 硬件环境273.2.2 软件环境273.3框架基础示意图273.3.1 服务端监听示意图283.3.2横向
3、切面请求拦截器示意图293.3.3路由分发器示意图313.3.4 Cookie示意图333.3.5 Session示意图343.4 本章小结35第四章 核心功能使用364.1 下载FastJsonWeb.364.2 FastJsonWeb文件目录介绍364.3 FastJsonWeb的API说明及使用说明374.3.1 Cookie.js374.3.2 mime.js394.3.3 request_handle.js394.3.4 server.js404.3.5 session.js404.3.6 业务处理对象424.3.7 请求横向切面拦截器434.3.8 动态方法调用434.3.9 属性
4、注入444.4 本章小结46第五章 实例介绍475.1 获取框架475.2 编写业务逻辑475.2.1 设置服务器监听端口475.2.2 实现Hello FastJsonWeb485.2.3 用户登录功能505.3本章小结54第六章 不足与发展556.1 框架的不足556.2 框架的发展576.3 本章小结58参考文献59谢 辞60基于Node.js的小型框架设计与实现摘要:node.js是一种新的软件开发平台,它不仅是一门独立的语言,也与Python、Ruby一样,既是语言也是平台。node.js将javascript从浏览器移植到了普通服务器上。使得javascript也能实现了诸如文件系
5、统、操作系统、网络通信等功能。Node运行在Chorme的V8引擎上,采用异步I/O与事件驱动的架构设计和单线程模型,并且内置了HTTP服务器,主要用于构建高性能,高并发,高扩展的服务器。node.js具有高性能的同时,对于底层的封装比较低,如一般的请求数据等都需要分析Http协议并将所需的数据从request数据流中解析出来,没有提供如java web般丰富的API,这既是优点也是缺点,优点在于为开发者提供了非常大的自由性,可以利用底层接口完成各种各样的功能,缺点在于直接使用底层接口做系统应用开发,效率非常低下,因为需要分析和处理各种数据。node.js刚推广不久,国内还比较缺少使用node
6、.js做应用开发的框架,如果直接使用node.js底层API进行应用开发有较大的困难,基于此点,本论文开发设计一个简单小型的MVC框架,简化node.js的使用的同时提高开发效率。目前 web 应用中,普遍使用了MVC模式(即Model-View-Controller,模型,视图,控制器)。如基于 JAVA EE 的Struts2 + Spring3 + jsp MVC模式等 。借鉴这些其他平台上现有的框架结构和功能,设计开发FastJsonWeb框架。本框架将封装node.js的底层接口,对请求数据等提供统一简洁的方式,从而较大幅度的提升开发效率。基于对不同平台现有框架分析提取出本框架的功能
7、点。这些功能点包括 路由转发与映射,属性注入,Cookie实现,Sesison实现等。关键词:node.js;javascript;ABSTRACTNode.js is not only a separate language,but a new software development platform. Just like the Python and the Ruby, they are both language and platform.Node.js transplant the javascript from your browser to a common server. Th
8、at makes JavaScript can achieve as file systems, operating systems, network communications, and other functions.The Node.js is always running in Chorme V8 engine, with asynchronous I / O and event-driven architecture design and single-threaded model, and built-in HTTP server, mainly for building hig
9、h-performance, high-concurrency, highly scalable server.Node.js really get a high performance ,while the package of bottom part is low enough.For example, the common data requested need analysis of HTTP and analyze the required data from the request data stream,without providing a rich java web API.
10、This style offered an advantage and a disadvantage. The advantage is that it provided the developers with a lot of freedom so that the developers can use the low-level interface to complete a variety of functions, while the disadvantage is that the direct use of the low-level interface for system ap
11、plication development got very low efficiency, because of the analyzing and processing for the various kinds of data need a lot of resources.Node.js is just carried our, in our country, the framework used the node.js in doing application development is still lacking. A directly use of the Node.js un
12、derlying to work on an application development may be much more difficult. In order to deal with this kind of situation, this article will describe a design of a simple and small MVC framework to simplified the use of Node.js, and to improve the development efficiency at the same time.Nowadays, Web
13、applications get a wide use of the MVC pattern (Model-View-Controller, Model, View, Controller). Such as the Struts2 + Spring3 + jsp MVC model based JAVA EE . Learning from the structure and function of these existing framework, this article try to describe the design and development of FastJsonWeb
14、framework. This framework will pack the Node.js underlying interface, and provide a unified and concise manner to the request data, which will improve the development efficiency a lot. This article will extract the framework function points according to the analysis of the existing framework of diff
15、erent platforms. These function points include the route forwarding and mapping, property injection, cookie achievement and Sesison achievement and something more.第一章 绪论 1.1 node.js介绍随着网络技术的发展和网络平台的推广,越来越多的应用是基于网页形式来提供。其中javascript是网页应用技术中不可缺少的一部分。Javascript跟随网络技术的发展得到了也得到了大幅的提升。越来越多的人使用javascript。由
16、于javascript在浏览器端具有极高的执行效率,并且兼容多种流浪器,这促使其中一部分人思考是否可以把javascript放在服务端运行,能够像其他web语言一样提供业务逻辑处理。于是不久node.js便诞生了。node.js是一种新的软件开发平台,它的特殊性决定了它不仅可以作为一门开发编程语言,也可以像Ruby、Pythond等语言一样作为一个开发者平台。node.js将javascript从浏览器移植到了普通服务器上,它运行在Chrome的V8高速引擎上,实现了操作系统访问、网络通信、文件读写等功能。 目前 web 应用普遍采用Tomcat,Apache Server,IIS等做HTTP
17、服务器,HTML,CSS javascript做前端展示,以 浏览器服务器后台 容器 模式来进行请求应答。该模式下请求通过了一层或多层转发,使得通信效率较低。而在Node中,后台容器 用C+语言设计把服务器和容器本身融合在一起,采用 浏览器 后台容器 模式进行请求应答,大大提高了通信的效率。不同于其他的语言的线性执行,Node采用事件驱动机制,充分利用了CPU的时间片轮转机制,很大程度上降低了CPU 的空闲率,同时它异步I/O与事件驱动的架构设计和单线程模型对于构建高性能,高并发,高扩展的服务器具有相当大的优势。因此,采用node.js为后台的web应用或者企业应用能够较大程度的降低硬件成本和
18、提高应用处理业务的效率。新的开发平台,需要新的发展。1.2 node.js平台的优势领域node.js 自身融合入HTTP 服务器,这对于组合网站和服务器是非常简单方便的。这是它和其他web语言如 PHP、Perl 的不同所在。比如,在使用 PHP 进行业务系统开发,首先必须搭建一个HTTP 服务器如 Apache,IIS 之类。然后通过 该Http服务器的模块加载或 CGI 调用,将脚本的执行结果反馈显示在用户端。使用 node.js 平台好处之一在于不用额外搭建 HTTP 服务器, node.js 本身融合的Http服务器既可以作为开发阶段的调试环境也可以直接作为产品提供给客户使用。除此之
19、外,自带的服务器性能足以满足生产环境的要求。node.js 既可以在网络环境下运行也可以非网络的环境下运行,如即时编译终端。node.js 虽然使用javascript语言,但是它同样可以调用C或者C+ 的函数库,完成对性能要求非常高的功能的实现。事件驱动与异步式I/O模型。node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。传统架构对于高并发的解决方案是采用多线程模型,也就是一个系统线程处理一个业务逻辑,通过系统线程切方式弥补同步式 I/O 的时间开销。node.js 采用的是单线程模型通过异步式的请求方式处理I/O调用,减少了切换上下文次数所造成的开销。node.js运
20、行的过程中将管理一个事件堆栈,不断地循环执行事件然后等待下一个事件的触发。异步式 I/O 请求完成后将被推送到事件队列,等待主进程进行处理。基于事件的异步处理机制的node.js对于所有的网络通信、磁盘读写、数据库操作等都以异步请求的方式实现,最后将执行得到的结果交给事件循环进行处理。下图1.1描述了这个机制。 图1.1node.js 进程在进行事件处理时具有时间的唯一性,它不会同时处理多个事件请求,在处理完一个事件后就进程就进入下一个事件循环,检查并继续处理后面的事件。这样做优点在于能够集中CPU 和内存资源快速处理某个事件,并且尽量让耗费资源的 I/O 操作并行执行。在应对恶意访问方面,n
21、ode.js对于低速的DOS攻击,node.js 只增加事件堆栈中的请求请求树立,而不会马上给出请求应答,这样有效的减少了线程资源的开销,很大程度上提高了 Web 应用的健壮性和安全性。由于node.js 采用事件驱动与异步式 I/O 代替多线程,较大幅度的提升性能。此外node.js 除了使用Google的Chrome V8 作为JavaScript引擎,它还使用了高效的 libeio和库libev支持事件驱动和异步式 I/O。 node.js 架构的示意图如下 图1-2设计node.js 的开发者从 libev 和 libeio 库中进一步封装出来出libuv层。在 Windows 下,l
22、ibuv 使用了 Windows的 IOCP(Input/Output Completion Port,输入输出完成端口)机制,实现高性能,而对于Linux、UNIX,Mac OS X等操作系统,node.js的libuv 库通过使用libeio和libev 的封装来利用 kqueue 或 epoll。以上简单介绍了node.js。那么为网络而生的node.js能够做一下事情。(1)大规模的社交网络 Web 应用,如微博,FaceBook等。(2)具有复杂逻辑的网站;如一般的MIS系统。(3)Web Socket 服务器;如游戏引擎。(6)TCP/UDP 套接字应用程序,即时通信系统;(7)客
23、户端 JavaScript 编译器。由于node.js具有以上优点,所以对于web应用来说node.js是优秀的开发平台。1.3 node.js平台的非擅长领域一个优秀的平台能够吸引大量开发者的关注。node.js有许多传统架构不具备的优点,以至于开发者愿意用node.js来做应用开发。但是node.js 与其他任何平台一样,都存在优点和缺点,如果非要使用它的缺点来完成业务需求,那么同样会遇到困难和僵局。尽管它是高性能的,新颖的,但也不得不写出难以理解的逻辑代码。与大多数新语言平台本质一样,node.js 也是旧瓶装新酒。只不过概念比较新潮,它不能完成所有的业务逻辑,或者说它不是万能的。前一节
24、提到node.js的平台优点,本节则简要介绍下node.js的短板所在。(1)多任务的单用户应用前面介绍的都是服务器端编程,设计时的情况是用户数量很多。但如果面对的是单用户,譬如本地的命令行工具或者图形界面,那么就不存在所谓的大量并发请求。于是另一个问题出现了,尽管是单用户,却不一定是执行单任务。例如在给用户提供界面的时候后台需要进行某个计算,为了使用户界面不出现阻塞状态,不得不开启多线程或多进程。而到目前为止node.js 的线程或进程之间的通信还不方便,因为它根本没有资源锁,所以号称不会死锁。多进程的node.js 往往是在执行同一任务,通过多进程利用多处理器的资源,但遇到多进程相互协作时
25、,node.js的短板就出现了。(2)编码与国际化node.js 不支持完整的UTF-8字符编码,很多字符无法用string 表示。实际上来说这不是node.js 本身造成的,问题而是出在JavaScript 标准上。目前JavaScript 支持的是双字节的UCS2字符集,即两个字节来表示一个Unicode 字符,这样能表示出来的字符数是65536。明显,汉字就不止这个数目。因此无法表示某些生僻汉字,以及一些较为罕见语言的文字。这是设计的问题,源于当时设计者的主观判断。最初的Unicode设计者认为65536个字符足以表示全世界所有的文字,因此那个时候兼容Unicode 的系统或平台,如Wi
26、ndows、Java 和JavaScript在后来都遇到这个问题。随后Unicode意识到用2个字节表示所有字符是远远不够的,随后推出了UCS4编码,即用4 个字节来表示一个Unicode 字符。原有的定长编码的UCS2系统为了变长的UTF-16编码进行了升级处理,所以只有它向下兼容UCS2。UTF-16编码采用定长的双字节编码处理UCS2 以内的字符,对于以外的部分则使用多字节的变长编码。这样在通常情况下它的编码是定长的,有利于提高运算效率并且且兼容了UCS2编码,缺点是它本质还是变长编码,在应用程序中处理起来还是存在不便之处。JavaScript当下支持的仍是定长的UCS2编码 而不是UT
27、F-16,因此对于处理使用UCS4进行编码 的字符无能为力。这个缺陷存在于现有的所有JavaScript 引擎。包括Chrome的V8 引擎在内。因此你无法处理罕见的字符的时候,想用node.js 实现一个多语言的字典工具是不可能做到的,除非放弃使用javascript原有的string 数据类型,将所有的字符当作二进制的Buffer 数据来处理。(3)复杂逻辑的事务node.js 的控制流是非线性的,它由一个个事件响应组成,但人的思维却是线性的,当试图转换思维来适应语言或编译器时,就得付出性能或者编码方面的代价。举个例子,如要实现以下逻辑:从银行取钱,用钱去购买一个虚拟商品,买完以后加入库存
28、数据库,这中间的任何一步都会涉及数十次甚至更多的的I/O操作,而且任何一次操作失败以后都需要进行回滚操作。这个过程是复杂的线性的,假如拆分为非线性的逻辑,那么其复杂程度将提升几个数量级。node.js更善于处理那些逻辑简单但访问频繁的任务,而不适合完成逻辑十分复杂的工作。(4)需要大量计算的程序node.js (在0.8版本以前)不支持多线程。node.js的设计者和追随其的开发者坚信单线程和事件驱动的异步式编程比传统的多线程编程运行效率更高。但实际上多线程通过较大的开销也能达到同样的吞吐量,而且不必为多核环境进行特殊的配置。对比而言,node.js其单线程性的特性,如果需要充分利用多核资源则
29、需要使用多进程的方法才能达到node.js理想情况下的单线程执行过程会将100%利用CPU核心资源,所有请求须等待当前请求处理完毕后才进入事件循环才能响应。如果应用是需要进行大量的计算除非人为地分开计算,否则将会有相当大的请求响应延迟。不过在实际使用中的Web 服务器中,很少需要大量计算的部分很少,即使存在,那么不应该被实现为即时的响应。一般的处理办法是后台处理完成后给前台客户端异同处理完成的通知。1.4 开发框架的原因node.js刚推广不久,国内还缺少使用node.js做应用开发的框架。Node.js只提供底层的http接口。缺少丰富的上层应用接口。直接使用底层接口做开发需要分析大量的ht
30、tp协议内容。对于开发效率有着严重的制约。基于此点,本论文开发设计一个简单小型的MVC框架,简化node.js的使用难度的同时提高开发效率。目前 web 应用中,普遍使用了MVC模式(即Model-View-Controller,模型,视图,控制器)。如基于 JAVA EE 的Struts2 + Spring3 + jsp MVC模式等 。借鉴这些其他平台上现有的框架结构和功能,设计开发FastJsonWeb框架。本框架将封装node.js的底层接口,对请求数据等提供统一简洁的方式,从而较大幅度的提升开发效率。基于对不同平台现有框架分析提取出本框架的功能点。这些功能点包括 路由转发与映射,属性
31、注入,Cookie实现,Sesison实现等。1.5开发框架存在的问题小型的MVC框架意味着该框架应具有易用性和高效性,能够很大程度上满足大多数业务的逻辑。在现有的已存在的Node的MVC框架中,如Express,已经能够满足大多数业务逻辑 ,但是因为是国外开发,其文档资料大多数是英文编写,需要高昂的学习成本,而且大多数功能对于一般的应用是冗余的,加之配置复杂,遇到问题无法得到有效快速的解决途径,贸然采用存在大的风险。而自己开发,虽然时间周期长但因为其可重用性,还是具有较高的价值。由于平台的新颖性,多数API 还处在变化之中,因此设计开发该框架主要存在以下一些问题。(1)node.js还处于高
32、速发展阶段,API不稳定,处在不断更新变化中,如果采用某个固定版本,则可能存在bug或者无法使用新特性。如果跟随版本变化则框架的稳定性无法保证。(2)node.js平台资料困乏。主要表现在两个方面,一是新平台国内研究使用的人暂时不多,遇到问题无法立马得到咨询有效的解决;二是缺乏中文资料,有关资料只能去node.js的官方文档查询而且是英文。问题的交流只能在Stack Overflow等国外论坛但是是英文环境,交流存在一定的困难。(3)node.js对于Window平台支持不是好,一些常用工具无法安装。缺乏良好的桌面开发环境,对于类Unix系统的使用,如Linux的发行版Ubuntu有生疏性,无
33、法得心应手。(4)缺乏有效的开发工具。如今不管哪个系统平台下,javascript开发IDE都很少,或者难以使用,缺乏有效的调试工具,编码效率得不到提高。(5)由于node.js基于事件驱动和异步I/O,对于业务逻辑的处理往往不同于一般线性编程,难以打破线性编程的思维僵局。(6)node.js封装性非常低,对于一些常用操作,如Cookie,Seesion等都需要根据Http头信息重新实现,难度较大。(7)目前没有任何一个官方文档规定node.js的代码风格,为了保持框架代码的可读性和可维护性,需要定制某一标准,方便今后的维护。以上七点主要是分析了node.js平台存在的不足和一些设计实现的困难
34、之处。1.6本章小结该章简单的介绍了node.js平台架构,使用node.js的局限性和其优点以及框架进行设计与开发存在的难点。第二章 开发工具及技术综述本章主要是介绍框架设计与实现过程中主要使用到的设计工具、开发工具、开发平台以及javascript的一些高级语言特性。工具有vim和git,平台主要是github与Ubuntu。除此以外,还将介绍在Ubutun下如何搭建node.js开发平台。2.1使用工具简介2.1.1 文本编辑器Vim简介Vim是从 vi 发展出来的一个文本编辑器。具有代码补全、终端编译及错误跳转等提供编程效率的功能。Vim在程序员中被广泛使用,与Emacs并列成为类Un
35、ix系统用户最受欢迎的编辑器。设计理念vim的设计理念是组合。包括命令组合和模式间的组合。命令组合: Vim强大的编辑能力中很大部分是来自于其普通模式命令。vim的设计理念是命令的组合。例如普通模式命令dd删除当前行,dj代表删除下一行,因为是第一个d含义是删除,j键代表移动到下一行,组合后dj删除当前行和下一行。类似的命令组合非常丰富,只要拥有足够的创造力就可以灵活的组合各种命令进行使用,这样就能更加高效的进行文本编辑。vim针对程序语言代码编写者。写代码的时候手需要时刻保持在键盘上,随机定位代码、随机删除代码、移动代码、插入代码的操作大大多于阅读、翻页操作,中间卡顿一下效率就大大降低了;但
36、对普通用户而言,顺序写、设置字体格式、翻页读多于随机写删除操作, 且每个动作之间本身就有很多的停顿,用其他UI编辑器(word,notePad+等)效率反而比VIM高效,使用vim进行操作只会徒增代码编写的难度。主要功能:1.完全兼容vi2.多文件数据缓冲编辑3.编辑窗口切割,分成多个编辑视图4.可以在脚本中调用其他脚本语言5.自动单词补全与撤缩写功能6. 文本编辑历史记忆功能7.语法高亮显示8.文件备份三种编辑模式Vim编辑器具有三种模式,分别是常规模式,插入模式,命令模式,如下图2.1所示图2.1Vim三种模式的相互转换如下:常规模式进入命令模式: 在常规模式下输入“:”.常规模式进入插入
37、模式: a - 光标后插入文本A -当前行插入文本i - 光标前插入文本I -当前行前插入文本 o -当前行的下边插入新行O-当前行的上边插入新行s -删除光标所在处字符,并进入插入模式S -删除光标所在的行,并进入插入模式 插入模式进入常规模式:按下ESC键即可。其中插入模式和命令模式之间无法直接转换。优点总结相对于传统的IDE,VIM具有安装包小,启动快,支持纯终端编辑等优点。运用各种插件几乎能提供所有IDE所具备的功能。抛开鼠标仅通过键盘就可以完成任何文本操作,非常的方便快捷。能够大大加强对代码的掌握程度。2.1.2 git简介源代码版本控制系统介绍源代码版本控制是用来记录若干源码文件内
38、容变化,方便以后用来查看修改某特定版本代码的系统。程序员经常需要保存系统代码的所有修订版本用来查找bug。对此一般的做法都是采用版本控制系统 (VCS)。版本控制系统的好处在于它可以将一个或者多个代码文件恢复到以前的某个状态,不仅如此它还可以将整个工程都回溯到过去的某个时间点。版本控制系统可以通过比较文件细节变化找出该文件的最后修改人,同时还可以通过对比找出导致出现怪异问题所在或者某个功能缺陷等等。一旦使用版本控制系统关于工程,那么不管整个项目中的文件如何改动删除,最后也可以完整的恢复原来的某个版本。完成这个需求所做的工作量非常少。 Git介绍Git也是众多版本控制系统中的一员。它当初诞生的原
39、因是为了更好的维护Linux内核源代码。它不同于其他的版本控制器,如svn,cvs等之类的,它具有速度快、设计简单、对非线性开发模式支持强(允许上千个并行开发的分支)、完全分布式、能高效管理超大规模工程项目(速度和数据量)等。git原理在Git 版本控制系统内。每一个文件都只有存在三种状态:已提交,已修改和已暂存。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。因此用Git 管理项目工程时时,代码文件在三个工作区域内循环存在,它们分别是:Git 的工作目录,暂存区域,以及本地仓库。如下图所示图2
40、.2Git中的文件状态变化周期如图所示。图2.3Git与其他版本控制系统Git 和其他版本控制系统的主要差别在于,其他版本控制系统只关心文件内容发生的差异变化,如图2.4。 图2.4而Git关心的则是文件数据的整体变化如图2.5 图2.5git总结Git的设计颠覆了传统版本控制的设计思想,对于文件控制的每环节的实现方式提供了新的设计方案。Git实际上可以看做一个文件系统,不过对比普通文件系统它显得非常小巧而已。2.1.3 javascrip高级语言特性node.js是基于javascript设计的,因此框架在设计实现时需要大量运用高级语言特性以此实现框架的可读性和可复用性。下面介绍javasc
41、ript的相关语言特性变量的作用域结构化编程语言中的一个重要概念是作用域,变量的可见范围和生命周期就是由作用域所决定。正确使用作用域可以使代码更清晰、易懂。作用域可以减少命名冲突,而且作用域是垃圾回收的基本单元。JavaScript 的作用域与常见的语言如C、C+、Java等不同,它不是以花括号包围的代码块作为作用域,而是已函数的定义范围为作用域。这个特性被大多数人忽视并误解,从而导致了非常多的莫名其妙的错误。例如下面代码,在大多数类 C 的语言中会出现变量未定义的错误,而在 JavaScript 中却完全合法:if (true) var somevar = value;console.log
42、(somevar); / 输出 value这是因为 JavaScript 的作用域完全是由函数来决定的,if、for 语句中的花括号不是独立的作用域。全局作用域在 JavaScript 中有一种特殊的对象称为 全局对象。这个对象在node.js 对应的是 global对象,在浏览器中对应的是 window 对象。由于全局对象的所有属性在任何地方都是可见的,所以这个对象又称为 全局作用域。全局作用域中的变量不论在什么函数中都可以被直接引用,而不必通过全局对象。满足以下条件的变量属于全局作用域:在最外层定义的变量;全局对象的属性;任何地方隐式定义的变量(未定义直接赋值的变量)。需要格外注意的是第三
43、点,在任何地方隐式定义的变量都会定义在全局作用域中,即不通过 var 声明直接赋值的变量。这一点经常被人遗忘,而模块化编程的一个重要原则就是避免使用全局变量,所以我们在任何地方都不应该隐式定义变量。函数作用域不同于大多数类 C 的语言,由一对花括号封闭的代码块就是一个作用域,JavaScript 的作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,我们称为函数作用域。在函数中引用一个变量时,JavaScript 会先搜索当前函数作用域,或者称为“局部作用域”,如果没有找到则搜索其上层作用域,一直到全局作用域。JavaScript 的函数定义是可以嵌套的,每一层是一个作用域,
44、变量搜索顺序是从内到外。:对于开发者来说,在访问未定义的变量或定义了但没有初始化的变量时,获得的值都是 undefined。可以认为无论在函数内什么地方定义的变量,在一进入函数时就被定义了,但直到 var 所在的那一行它才被初始化,所以在这之前引用到的都是 undefined 值。闭包闭包(closure)是函数式编程中的概念,出现于 20 世纪 60 年代,最早实现闭包的语言是 Scheme,它是 LISP 的一种方言。之后闭包特性被其他语言广泛吸纳。闭包的严格定义是“由函数(环境)及其封闭的自由变量组成的集合体。” 闭包有两个主要用途,一是实现嵌套的回调函数,二是隐藏对象的细节。对象提起面
45、向对象的程序设计语言,大多数人能够立马想到的是 C+、Java 等强类型语言,以及 Python、Ruby 等脚本语言,它们共有的特点是基于类的面向对象。而说到 JavaScript,很少能让人想到它面向对象的特性,因为它没有类。虽然JavaScript 没有类,但JavaScript 是面向对象的语言。JavaScript 只有对象,对象就是对象,不是类的实例。因为绝大多数面向对象语言中的对象都是基于类的,所以容易混淆类的实例与对象的概念。对象就是类的实例,这在大多数语言中都没错,但在 JavaScript 中却不适用。JavaScript 中的对象是基于原型的。创建和访问JavaScrip
46、t 中的对象实际上就是一个由属性组成的关联数组,属性由名称和值组成,值的类型可以是任何数据类型,或者函数和其他对象。 JavaScript 具有函数式编程的特性,所以函数也是一种变量,大多数时候不用与一般的数据类型区分。在 JavaScript 中,使用句点运算符和关联数组引用是等价的,也就是说任何对象(包括this 指针)都可以使用这两种模式。使用关联数组的好处是,在不知道对象的属性名称的情况下,可以用变量来作为关联数组的索引。如:以下定义都是有效的 var obj = ; obj.prop_1 = bar; objprop_2 = falseJavaScript 提供了构造函数;如:fun
47、ction User(name, uri) this.name = name;this.age = age;this.show = function() console.log(this.name);以上是一个简单的构造函数,接下来用 new 语句来创建对象:var xiaomin = new User(byvoid,18);然后就可以通过 someuser 来访问这个对象的属性和方法了。上下文对象在 JavaScript 中,this 关键字代表语境环境的上下文,即被调用函数所处的环境。上下文对象的作用是在一个函数内部引用调用它的对象本身,JavaScript 的任何函数都是被某个对象调用的,包括全局对象,所以 this 指针是一个非常重要的东