JavaScript
Any application that can be written in JavaScript,
will eventually be written in JavaScript.
--Jeff Atwood
1.0、参考
1.2、JavaScript简介

JavaScript的创造者是Brendan Eich

JavaScript的第一版发布时间与Java稍微晚一点。

JavaScript这个名字就是为了借Java的势进行宣传, 为此,JavaScript的很多内置函数的名称和用法与Java一样。

JavaScript这个名字是个历史问题,人们提到JavaScript的时候,其实是指ECMAScript。也就是说,JavaScriptECMAScript可以互画等号。

1.3、JavaScript Engine

JavaScript Engine就是能执行且只能执行ECMAScript定义的那些语法的程序。

常见的JavaScript Engine

1.4、JavaScript Runtime
1.5、JavaScript Engine与JavaScript Runtime的区别

JavaScript Engine只能执行ECMAScript定义的那些语法的程序。

JavaScript Runtime不仅仅能执行ECMAScript定义的那些语法的程序。 还能执行更多。比如:

Web浏览器中,不仅仅能执行ECMAScript定义的那些语法的程序。 还可以执行BOM APIDOM APIXHR APIFetch API

Node.js环境下, 不仅仅能执行ECMAScript定义的那些语法的程序。 还能执行Node.js自己定义的API,但是不能执行BOM APIDOM APIXHR APIFetch API等在Web浏览器中的API。

JavaScript Runtime就是在JavaScript Engine的基础上增加了功能。 这种方式在软件架构设计中称为分层模型Chrome浏览器和Node.js都使用了V8引擎,但是他们都各自基于V8提供了不同功能。

1.6、JavaScript的模块

JavaScript中的模块指的是什么?

JavaScript中的模块指的就是一个个的js文件,一个js文件就是一个模块。 通常,一个js文件只实现一个功能。

JavaScript为什么要提出模块的概念呢?有了模块的概念到底能为开发者带来哪些好处?

  • 有了模块的概念,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。
  • 有了模块的概念,我们可以把不同功能的代码写成不同的模块。开发者可以根据自己的需要来选择使用合适的模块。 每个模块都会暴露一些公共的方法或属性。模块的使用者直接使用这些方法或属性即可, 对于内部的实现细节就可以不用了解。这样可以提高代码的可复用性,而且也便于管理。
1.7、JavaScript的模块系统

设计一个模块系统通常会考虑下面这几个问题:

  • 如何定义一个模块?
  • 如何导出一个模块中的变量让其他模块使用?
  • 如何加载一个模块?采用同步加载还是异步加载?多次加载同一个模块的结果是否需要缓存?
1.8、JavaScript的模块系统(规范/实现)

常见的JavaScript模块系统规范有如下5种:

规范实现使用环境
AMDrequire.jsWeb浏览器
CommonJSNode.jsNode.js
CMDsea.jsWeb浏览器
UMDWeb浏览器Node.js
ES6 ModuleWeb浏览器Node.js
1.9、JavaScript的约定俗成

这里的约定俗成不是语言规范,你可以不遵守,但是这些约定俗成的东西是大家达成共识的一些做法, 在看别人的代码的时候,你不知道这些约定可能会困扰。

1.9.1、变量前加下划线表示"私有变量"

JavaScript没有公有变量私有变量这些概念, 但是为了告诉看代码的人,某个变量不希望被外部引用,就在变量前面加上下划线,别人看到就不会在外部使用了, 在团队开发中,这种约定很有必要。

1.9.2、函数前加下划线表示"私有函数"

理由同上。