至此,我们讨论过的所有东西都限于JS语言本身。现实是大多数JS程序都是在浏览器这样的环境中运行并与之互动的。你所编写的很大一部分代码,严格地说,不是直接由JavaScript控制的。这听起来可能有点奇怪。

    你将会遇到的最常见的非JavaScript程序是DOM API。例如:

    1. var el = document.getElementById( "foo" );

    当你的代码运行在一个浏览器中时,变量document作为一个全局变量存在。它不是由JS引擎提供的,也不为JavaScript语言规范所控制。它采取了某种与普通JS object极其相似的形式,但它不是真正的object。它是一种特殊的object,经常被称为“宿主对象”。

    另外,document上的getElementById(..)方法看起来像一个普通的JS函数,但它只是一个微微暴露出来的接口,指向由浏览器DOM提供的内建方法。在一些(新一代的)浏览器中,这一层可能也是由JS实现的,但是传统的DOM及其行为是由像C/C++这样的语言实现的。

    另一个例子是输入/输出(I/O)。

    大家最喜爱的alert(..)在用户的浏览器窗口中弹出一个消息框。alert(..)是由浏览器提供给你的JS程序的,而不是JS引擎本身。你进行的调用将消息发送给浏览器内部,它来处理消息框的绘制与显示。

    console.log()也一样;你的浏览器提供这样的机制并将它们挂在开发者工具中。

    这本书,和整个这个系列,聚焦于JavaScript语言本身。这就是为什么你看不到任何涵盖这些非JavaScript机制的重要内容。不管怎样,你需要小心它们,因为它们将在你写的每一个JS程序中存在!