JavaScript Best Practices

5,491 阅读12分钟
原文链接: github.com

嗨!你们好

这是一份为 JavaScript 新手准备的指南,同时也包含了可以给高手学习的最佳资料

虽然本网站的名字是 the right way,但并不代表是学习 JavaScripr 的 唯一方法。

我们只是将一些顶尖开发者的文章、提醒和技巧收集于此。由于它是由一些非常厉害的网名身上收集而来,故称之为 'the right way'或是最佳做法。

开始入门

关于

由网景公司在 1995 年给网景浏览器2.0创建的一个当做 HTML 扩展,JavaScript 最初主要的功能就是操作 HTML 文档和表单验证。 在取得这么大的名声之前,JavaScript 被叫做 Mocha,当它第一次发布 beta 版本时它的官方名字是 LiveScript,当被 Sun Microsystems 发布时,被称作这个名字一直到今天。 由于相似的名字,人们老是把 JavaScript 和 Java搞混。虽然两者都有编程的语法结构,但是他们是不同的语言。 和C、C#、Java不同, JavaScript 是一个静态语言,也就是说他需要一个“解释器”,JavaScript的解释器就是浏览器。

最新版本

ECMAScript 是 JavaScript 的标准。截至2012年止,所有最新流行的浏览器都可以支持 ECMAScript 5.1。老的浏览器至少会支持 ECMAScript 3。2015年6月 ES6/ES2015 规范已完成。前往阅读 ECMAScript 2015 规范 Ecma International.

JavaScript 的最佳參考版本、參考资料及最新消息可以前往 Mozilla Developer Network.

DOM

Document Object Model (DOM) 是 HTML 及 XML 文档的 API。它提供了文件的结构化展现,让你可以使用脚本语言(如 JavaScript)來更改它的內容及视觉展现。其他更详细的內容 Mozilla Developer Network - 文件对象模型(DOM).

JavaScript 代码风格

编程风格规范

JavaScript 和其他编程语言一样,有各种版本的编程风格指南。或许大家会推荐 Google Code Style Guide for JavaScript,但我们更推荐 Idiomatic.js

代码检查

现在最好的 JavaScript 代码检查工具为 JSHint。我们强烈建议尽可能的使用检查工具来确认你的编码风格以及设计模式的正确性。

语言精粹

面向对象

JavaScriot 虽然和其他语言在面向对象上面有些不同的地方,但仍然具有面向对象的编程能力。

资源: JavaScript 面向对象编程介绍

匿名函数

匿名函数是在代码运行是动态执行的函数。之所以叫做匿名函数是因为他跟其他函数不同,它并没有函数名称。

资源: JavaScript anonymous functions

函数作为第一类对象

函数是 JavaScript 的第一对象。这意味着 JavaScript 中的函数只是一种特殊类型的对象,并且拥有一般对象所具备的能力。

资源: Functions are first class objects in JavaScript

弱类型

对于许多前端开发者而言,JavaScript 是他们所使用的第一个脚本语言。对这些开发者来说,弱类型的概念和印象或许像第二天性一样自然。然而现在网页应用的需求爆炸式增长,使得后端开发者必须涉足客户端技术。这类的开发者大部分都有强类型语言的背景,例如 C# 或 Java,因此并不熟悉弱类型语言所带来的高度自由及潜在陷进。

资源: Understanding Loose Typing in JavaScript

作用域和提升

作用域: 在 JavaScript 中,函数是我们在声明变量时,实际的作用域分隔符,也就是说常见的循环及表达式(如 if, for, while, switch 及 try)并“不能“指定作用域,这一点有别于大部分的程序语言。因此函数中的这些区块会共享作用域。这样使得在这些区块内部声明只属于这些函数块的变量行为可能是危险的。

变量提升: 在运行时,所有的变量及函数声明将会被移到函数的起始位置(即函式的作用域)- 这就是所谓的变量提示。虽然如此,但是良好的习惯是在作用域的一开始就声明所有变量,避免因未声明就操作变量造成未预期的错误。 -这是一个块作用域语言开发者常见的问题。

资源: JavaScript Scoping and Hoisting

函数绑定

刚开始学习 JavaScript 时,你可能不需要花什么时间在处理函数绑定上面,但你渐渐的会遇到如何在另一个函数中保留 this 内容的问题,最终你会了解,你正真需要的其实是函数原型绑定(Function.prototype.bind())

资源: Understanding JavaScript’s Function.prototype.bind

闭包函数

闭包是源于独立变量的函数。花奴话说,闭包中所定义的函数会「保留」它被产生出来时的环境。 了解这个概念很重要,因为他在开发过程中是有用的,类似私有方法的功能。它也可以帮助你学习如何避免一些常见的错误,例如在循环中使用闭包。

资源: MDN - Closures

严格模式

ECMAScript 5 的严格模式是用来限制一些 Javascript 不严谨的写法。严格模式并非只是一个子集:他特地的在语法上有别于一般的代码。各家浏览器对严格模式的支持也不同。所以开启严格模式时建议进行功能测试。严格模式的代码鱼非严格模式的代码是可以并存的,所以可以自由決定严格模式部分的多少。

來源: MDN - Strict mode

立即调用函数 (IIFE)

立即调用函数是指使用 JavaScript 的函数來限制作用域范围的模式。立即调用函数可以阻止块作用域内的变量提升,保证块作用域内的变量不被其他作用范围的变量污染,同时也允许声明公共方法来操作函数块里的私有变量。

这种模式被称为自执行匿名函数,但 @cowboy (Ben Alman) 为它定义了语义上更合适的名字 IIFE

资源: Immediately-Invoked Function Expression (IIFE)

设计模式

说明

虽然 JavaScript 包含了自身语言独有的设计模式,但许多经典的设计模式仍然可以借鉴。

Addy Osmani 的开源书 Learning JavaScript Design Patterns 是很好的学习资料,下面大多数的链接都出自本书。

设计模式

创建型设计模式

结构性设计模式

行为设计模式

框架模式(MV* Patterns)

底下有一些 JavaScript 传统 MVC 模式及从中衍生出来的模式。

测试工具

说明

JavaScript 代码测试相关的函数库和框架。

Links

TJ Holowaychuk 维护。

jQuery 维护。

Pivotal Labs 维护。

由 the team behind AngularJS. Mostly by Vojta Jina 维护。

Sitepen 维护。

JavaScript 代码覆盖率工具,由 Krishnan Anantheswaran 维护。

JavaScript 独立测试套件 Test spy, stub 及 mock)。 不依赖于任何的单元测试框架。由 Sinon.JS community 创作。

模擬函数及 XHR 对象的测试帮助工具,由 Leo Balter 维护。

框架

热门

jQuery 是一个快速、轻巧及功能丰富的 JavaScript 库。由 John Resig 建立。

由 Yahoo 建立! YUI 是一个免费、开源的 JavaScript 及 CSS 库,用于建立富交互的 web 应用。 已于 2014年8月29日停止更新.

Zepto 是一个针对现在浏览器开发的,极简的 JavaScript 函数库,兼容大量的 jQuery API。只要你会用 jQuery,那么你已经会用 Zepto 了。

Dojo 是一个免费、开源的 JavaScript 工具包,用來建立高效能的网站应用。赞助商商有 IBM 及 SitePen。

Underscore.js 是一个提供整套函数式编程的好工具,同时并不扩展原生 JavaScript 的库。

MV*

非常热门的 JavaScript 客户端框架,由 @jashkenas 建立。

@wycats 建立, jQuery 及 Ruby on Rails 核心开发者。

使用 Model-View-View Model (MVVM) 构建简单动态的 JavaScript 用户界面。

由 Google 建立,Angular.js 类似 polyfill 用于 HTML。

Cappuccino 是一个可以让人简单搭建运行在浏览器的桌面应用的开源框架。

JavaScriptMVC 是一个包含 jQuery 最佳创意的开源框架。

Meteor 是一个不管菜鸟还是高手都可以在短时间内建立起高质量的网络应用的开源平台。

Spice 是一个非常小(< 3k)且有可扩展性的 javascript MVC 框架。 Spice 可以轻松的融合任何已有的应用正在使用的技术如 jQuery、pjax、turbolinks、node 或是和任何你正在使用的技术共同顺利工作。

Riot 是快速且功能强大的轻量客户端(MV*)函数库,用于创建大型的网络应用。 尽管它的体积很小,但却包含以下組成:模版引擎、路由、事件函数库及标准的 MVP 模式,让代码保持模块化。

CanJS 是一个可以让开发复杂应用程序变得简单且快速的框架。 学习简单、轻巧并且不改变你的应用结构,同同时更提供一些新的功能,如自定义标签和双向绑定。

函数库

由 Facebook 创建。 React 是一个 JavaScript 函数库,用于开发 Facebook 及 Instagram 的用户界面。 许多人认为 React 是 MVC 中的 V。

Handlebars 让你可以无痛的建立有语义的模板。

浏览器和 node.js 的非同步模板。

动画

Velocity 是一个和 jQuery 的 $.animate() 有相同 API 的动画引擎。

Bounce.js 是一个让你创造精美 CSS3 动画的工具及 JS 函数库。

一个简单且强大的 JavaScript 函数库,用來建立 HTML5 的。

Move.js 是一个基于 CSS3 极为简单又优雅 JavaScript 函数库。

SVG 是一个专门处理交互、高解析度的矢量图,让各种大小的屏幕都能完美的呈现画面。

Rekapi 不但是一个创建 canvas 及 DOM 动画的 JavaScript 函数库,同时也是新一代浏览器中的 CSS @keyframe 动画。

用标识、图片或视频来建立你喜爱的图标。

Textillate.js 结合许多写的不错的函数库来提供一个容易使用的的插件,让人可以在任何內容中使用 CSS3 的动画。

Motio 是一个轻量的 JavaScript 函数库,基于动画和平移建立简单且强大的的 2D 动画。

使用 Anima 可以让人简单的同时操控近百个对象。 每一个对象都能有仿真的质量及速度效果!

游戏引擎


MelonJS 是一个免费、轻量的游戏引擎。 这个引擎集成了地图拼接格式,让关卡设计变得更轻松。

ImpactJS 是从2010年底开始发布的可测试及运行的 HTML5 游戏引擎之一。 它保持良好的更新和维护,也用有一定的社区人员支持它。 它除了有两个关于如何使用此引擎建立游戏的书籍外,还有大量的文档可參考。

LimeJS 是一个可以在各种触控屏幕及桌面浏览器上建立快速、原生体验游戏的 HTML5 游戏框架。

Crafty 是从 2010 年开始就存在的一个游戏引擎。 Crafty 开发 JavaScript 游戏变得相当容易。

Cocos2d-html5 是一个 MIT 许可的开源 2D 游戏框架。 它是一个 HTML5 版本的 Cocos2d-x 计划。 Cocos2d-html5 的开发者终于让 Cocos2d 可以跨平台。

Phaser 依赖于 Flixel。 由已在 HTML5 社区活跃多年的 Richard Davey (Photon Storm) 维护。

Goo 是一个基于 WebGL/HTML5 建立的 3D 游戏引擎。

LycheeJS 是一个 JavaScript 游戏函数库,提供原型及 HTML5 Canvas,WebGL 或 原生 OpenGL(ES) 在网络浏览器或本地环境部署的完整解決方案。

Quintus 是一个采用模块化设计的 HTML5 游戏引擎、轻量、使用容易具有简洁的 JavaScript 语法。

Kiwi.js 是一个有趣且友善的开源 HTML5 游戏引擎。 有些人称它为 HTML5 游戏引擎界的 WordPress。

Panda.js 是一个用于手机及电脑,使用 Canvas 和 WebGL 渲染的游戏引擎。

阅读

文章

作者 Quildreen Motta

作者 Yehuda Katz

作者 Scott Allen

作者 Ben Alman

作者 Nico Bevacqua

作者 Viljami S.

作者 Kirupa Chinnathambi

作者 Kirupa Chinnathambi

作者 JavaScript Is Sexy

作者 Ju Gonçalves

书籍

作者 Marijn Haverbeke

作者 David Flanagan

作者 Douglas Crockford

作者 Stoyan Stefanov

作者 James Coglan

作者 Nicholas C. Zakas

作者 Nicholas C. Zakas

作者 Henrik Joreteg

作者 Stoyan Stefanov

作者 Dustin Diaz

作者 John Resig

作者 Nicolas Bevacqua

作者 Axel Rauschmayer

作者 Christian Johansen

作者 >Kyle Simpson

作者 Ryan Burgess

作者 Ivo Wetzel

作者 David Herman

作者 Michael Fogus

作者 Reginald Braithwaite

作者 DevFreeBooks

免费电子书

入门学习网站

网站创始兼维护者

William oliveira William Oliveira

贡献者

如果没有这些伟大的贡献者,本网站也无法完成。谢谢你们帮忙完成这个网站!

查看图片
JavaScript: The Right Way by William Oliveira.
Licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
Based on work at jstherightway.org.