前面 HTML 是一种标记语言, CSS 也是一种样式语言

JavaScript 是一种编程语言

计算机语言和编程语言的关系和区别:

  • 计算机语言: 计算机语言(computer language)指用于人与计算机之间通讯的语言,是人与计算机之间传递信息的介质。但是其概念比通用的编程语言要更广泛。例如, HTML 是标记语言,也是计算机语言,但并不是编程语言
  • 编程语言: 编程语言(英语: programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧, 用来向计算机发出指令,一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动

编程语言的特点:

  • 数据和数据结构
  • 指令及流程控制
  • 引用机制和重用机制
  • 设计哲学

JavaScript(通常缩写为 JS)是一种高级的、解释型的编程语言

JavaScript 是一门基于原型、头等函数的语言,是一门多范式的语言,它支持面向对象程序设计,指令式编程,以及函数式编程;

HTML 和 CSS 也是前端开发的重要组成部分, 而 JavaScript 是前端开发的灵魂

JS 起源

1994 年,网景公司(Netscape)发布了 Navigator 浏览器 0.9 版

  • 这是历史上第一个比较成熟的网络浏览器,轰动一时
  • 但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力
  • 急需一种网页脚本语言,使得浏览器可以与网页互动

网景公司当时想要选择一种语言来嵌入到浏览器中

采用现有的语言,比如 Perl、 Python、 Tcl、 Scheme 等等, 允许它们直接嵌入网页

1995 年网景公司招募了程序员 Brendan Eich,希望将 Scheme 语言作为网页脚本语言的可能性

1995 年 Sun 公司将 Oak 语言改名为 Java,正式向市场推出

  • Java 推出之后立马在市场上引起了轰动, Java 当初有一个口号: “write once run anywhere”
  • 网景公司动了心,决定与 Sun 公司结成联盟,希望将 Java 嵌入到网页中来运行
  • Brendan Eich 本人非常热衷于 Scheme,但是管理层那个时候有点倾向于 Java,希望可以简化 Java 来适应网页脚本的需求

但是 Brendan Eich 对此并不感兴趣,他用 10 天时间设计出来了 JavaScript

  • 最初这门语言的名字是 Mocha(摩卡)
  • 在 Navigator2.0 beta 版本更名为 LiveScript
  • 在 Navigator2.0 beta 3 版本正式重命名为 JavaScript,当时是为了给这门语言搭上 Java 这个热词

这门语言当时更像是一个多种语言的大杂烩

  • 借鉴 C 语言的基本语法
  • 借鉴 Java 语言的数据类型和内存管理
  • 借鉴 Scheme 语言,将函数提升到”第一等公民”(first class)的地位
  • 借鉴 Self 语言,使用基于原型(prototype)的继承机制

微软公司于 1995 年首次推出 Internet Explorer,从而引发了与 Netscape 的浏览器大战

  • 微软对 Netscape Navigator 解释器进行了逆向工程,创建了 JScript,以与处于市场领导地位的网景产品同台竞争
  • 这个时候对于开发者来说是一场噩耗,因为需要针对不同的浏览器进行不同的适配

1996 年 11 月,网景正式向 ECMA(欧洲计算机制造商协会)提交语言标准

  • 1997 年 6 月, ECMA 以 JavaScript 语言为基础制定了 ECMAScript 标准规范 ECMA-262
  • ECMA-262 是一份标准,定义了 ECMAScript
  • JavaScript 成为了 ECMAScript 最著名的实现之一
  • 除此之外, ActionScript 和 JScript 也都是 ECMAScript 规范的实现语言

ECMAScript 是一种规范,而 JavaScript 是这种规范的一种实现

  • 除了语言规范之外, JavaScript 还需要对页面和浏览器进行各种操作
  • 除了基本实现之外,还包括 DOM 操作和 BOM 操作

JS 运行

我们经常会说:不同的浏览器有不同的内核组成

  • Gecko: 早期被 Netscape 和 Mozilla Firefox 浏览器浏览器使用;
  • Trident: 微软开发,被 IE4~IE11 浏览器使用,但是 Edge 浏览器已经转向 Blink;
  • Webkit: 苹果基于 KHTML 开发、开源的,用于 Safari, Google Chrome 之前也在使用;
  • Blink: 是 Webkit 的一个分支, Google 开发,目前应用于 Google Chrome、 Edge、 Opera 等;

事实上,我们经常说的浏览器内核指的是浏览器的排版引擎:

  • 排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎

JavaScript 代码由 JavaScript 引擎来执行

  • 高级的编程语言都是需要转成最终的机器指令来执行
  • 事实上我们编写的 JavaScript 无论你交给浏览器或者 Node 执行,最后都是需要被 CPU 执行
  • 但是 CPU 只认识自己的指令集,实际上是机器语言,才能被 CPU 所执行
  • 所以我们需要 JavaScript 引擎帮助我们将 JavaScript 代码翻译成 CPU 指令来执行

常见的 JavaScript 引擎:

  • SpiderMonkey:第一款 JavaScript 引擎,由 Brendan Eich 开发(也就是 JavaScript 作者)
  • Chakra:微软开发,用于 IT 浏览器
  • JavaScriptCore: WebKit 中的 JavaScript 引擎, Apple 公司开发
  • V8: Google 开发的强大 JavaScript 引擎,也帮助 Chrome 从众多浏览器中脱颖而出

浏览器内核和 JS 引擎的关系

  • 这里我们先以 WebKit 为例, WebKit 事实上由两部分组成的:
    • WebCore: 负责 HTML 解析、布局、渲染等等相关的工作
    • JavaScriptCore: 解析、执行 JavaScript 代码

小程序中也是这样的划分:

  • 在小程序中编写的 JavaScript 代码就是被 JSCore 执行的;

JS 应用