🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 出世 JavaScript出生在Netscape浏览器中,当时的网页主要是丑陋的静态文本以及简单的图片 那个时候,人们还在用Modem上网,网速只有28.8kbps 那个时候的人们在上网的时候有可能遇到下面这种问题,注册用户的时候填了一个表单,28s以后,服务器告诉他忘了选择性别。 这种问题完全可以由浏览器来判定,而不需要把数据提交到千里之外的服务器才能发现。 所以开发一种脚本在浏览器中运行势在必行。 不过JavaScript的发明者Brendan Eich没有想到JavaScript会这么火,他只使用了10天时间就设计出来了。所以在一些细节上处理得不够严谨 而且JavaScript本来叫LiveScript,但是为了向Java示好,LiveScript竟然被修改成了JavaScript,实际上这两种语言没有任何关系。 ## 成长 JavaScript无法读取文件,因为他生活在浏览器 使用JavaScript写的程序只能嵌入在HTML网页里面。能做的就是操作HTML的DOM和浏览器 什么是DOM呢? 浏览器从服务器取到HTML以后,会展示成页面,但是他的内部会把HTML组织成一个树。这个树就是DOM 例如: ``` <html> <head> <title>Sample Page</title> </head> <body> <p>hello world!</p> </body> </html> ``` DOM树会长这样: ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180816111626.png?picgo) 有了DOM树,JavaScript就可以定位到DOM树中任意一个节点,然后对这个节点进行操作,比如隐藏节点、显示节点、改变颜色、获得文本值、改变文本的值,添加点击事件等 而且这些操作可以立刻显示出效果来,完全不用刷新网页。 这些操作都是在内部完成的,HTML源码不会改变。所以当你打开HTML源码的时候,发现源码与浏览器看到的效果不一致。 所以JavaScript可以做表单验证,还功能控制浏览器比如打开窗口,获得浏览器的名称或者版本 ## 第一桶金 此时的JavaScript存在一个缺点:JavaScript只能在浏览器中运行,没有办法像Java那样访问网络,也就没有办法调用服务器端的接口来获取数据。 用户只能通过GET或者POST向服务器发送请求,这个时候服务器返回的是整个页面,而不是页面中的一个片段,也就是整个页面需要刷新一下,哪怕只是改变一个字 1998年IE5引入了一个新功能XMLHttpRequest,这个功能允许JavaScript向服务器发出接口调用 比如说拿用户名和密码,通过XMLHttpRequest去访问服务器端的登陆接口URL,这个过程需要耗费比较长的时间,在这段时间里面,浏览器不需要等待反回结果。 而与由JavaScript等待数据传输返回,然后调用回传函数,把DOM树的某个节点更新一下,例如让包含用户名和密码的登录框消失,再加一个提示消息:登录成功 如果服务器处理和网络速度都够快的话,用户会发现,没有刷新整个页面就已经登录了 这种方式可以使得网页局部刷新, 让用户浏览网页的体验极佳, 尤其是 Google 地图, Gmail 等应用让互联网应用火了起来。 ## JSON 后来有人把这种处理方式称为AJAX(“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)) 现在的问题是服务器返回了下面这端XML ``` <book> <isbn>978-7-229-03093-3</isbn> <name> 三体 </name> <author> 刘慈欣 </author> <introduction> 中国最牛的科幻书 </introduction> <price>38.00</price> </book> ``` 真正的数据很少,标签却很多。 JavaScript的语法中有个叫对象的东西,外层是一个花括号,内部是键值对,属性由逗号隔开。 ``` var book = { "isbn": "978-7-229-03093-3", "name": "三体", "author": "刘慈欣", "introduction": "中国最牛的科幻书", "price": "38.00" } ``` 这种结构可以表达上面XML的内容 而且还支持数组 ``` var books = [ { "isbn": "978-7-229-03093-3", "name": "三体", "author": "刘慈欣", "introduction": "中国最牛的科幻书", "price": "38.00" }, { "isbn": "978-7-229-03094-1", "name": "我是一个线程", "author": "刘欣", "introduction": "一个线程的自述", "price": "0.0" } ] ``` 数据和对象都支持嵌套 更重要的是,不需要使用XML解析器去解析,可以直接拿来用 ``` books[0].name --> 返回 “三体” books[1].introduction --> 返回 “一个线程的自述” ``` ## 巅峰 HTML 负责结构, CSS 负责展示, 而我(加上 AJAX, JSON) 负责逻辑。 于是前端编程三剑客形成了。 ExtJS, prototype, JQuery 这些框架把前端编程推向另外一个高峰。 甚至出现了 AngularJS 这样的奇葩,实现了 SPA(单一页面应用程序), 实在是难于想象。 现在JavaScript可以在浏览器端实现MVC,只需要在服务器端通过接口给JavaScript提供数据就行。 那么JavaScript可以移植到服务器端吗? 我们知道服务器端好处在于资源无限,缺点在于多线程编程,很多东西都需要加锁,基本上一个请求就是一个线程来处理,遇到数据库操作,线程必须等待。 那能修改成异步的吗?至少对Java来说比较难,因为已经积重难返了。 那么怎么把JavaScript放到服务器端呢? 首先得把浏览器端运行环境移到服务器端,而且执行速度还得足够快。 原来的引擎一直不合格,知道Chrome V8出现才解决问题。 其次还得绕开线程遇到IO、数据库、网络这种耗时操作还在等待的问题,必须搞成异步处理 2009年Ryan Dahl把JavaScript放到了服务器端,这就是Node.js 这样前端后端都可以使用JavaScript,优势就很明显了,前端后端采用同样的开发语言。