zoukankan      html  css  js  c++  java
  • 宿主环境(host environment)

      在此前的内容中,我讨论的都是JavaScript语言及其规范,而并非该语言的应用环境。在大多数人看来,JavaScript应用环境都是Web浏览器,这也的确是该语言最早的设计目标。然而从很早开始,JavaScript语言就已经在其他的复杂应用环境中使用,并受这些应用环境的影响而发展新的语言特性了 。

    JavaScript的应用环境,主要由宿主环境与运行期环境构成。其中,宿主环境是指外壳程序(Shell)和Web浏览器等,而运行期环境则是由JavaScript引擎内建的。图1-8说明由它们共同构建的对象编程系统的基本结构:

    图1-8  由宿主与运行期构成的应用环境 

    1.5.1  宿主环境(host environment)

    JavaScript是一门设计得相对“原始”一点点的语言,它被创生时的最初目标仅仅是为Netscape提供一个在浏览器与服务器间都能统一使用的开发语言。简单地说,它原来是想让B/S架构下的开发人员用起来都舒服那么一点点的。这意味着最初的设计者希望JavaScript语言是跨平台的,能够提供“端到端(side to side)”的整体解决方案。

    然而事实上这非常难于做到,因为不同的平台提供的“可执行环境”不同。而宿主环境就是为了隔离代码、语言与具体的平台而提出的一个设计。一方面我们不能让浏览器上拥有一个巨大无比的运行期环境(例如像虚拟机那么大),另一方面服务器端又需要一个较强大的环境,因此JavaScript就被设计成了需要“宿主环境”的语言 。

    ECMAScript规范并没有对宿主环境提出明确的定义。比如说,它没有提出标准输入输出(stdin、stdout)需要确切地实现在哪个对象中。为了弥补这个问题,RWC在WebAPIs规范中首先就提出了“需要一个Window对象”的浏览器环境。这意味着在RWC或者浏览器端,是以Window对象及其中的Document对象来提供输入输出的。

    但这仍然不是全部的真相。因为“RWC规范下的宿主环境”,并不等同于“JavaScript规范下的宿主环境”。本书并不打算讨论与特定浏览器相关的细节问题,因此我们事实上在说的是JavaScript的一个公共语言环境,或者说公共的宿主环境的定义。作为程序运行过程中对输入输出的基本要求,本书设定宿主环境在全局应当支持如表1-3所示的方法:
    表1-3  本书对宿主环境在全局方法上的简单设定

    方法

    含义

    alert(sMessage)

    显示一个消息文本(字符串),并等待用户一次响应。调用者将忽略响应的返回信息

     

    write(sText, ...)

    输出一个段文本,多个参数将被连接成单个字符串文本

    (*注1)

    writeln(sText, ...)

    (同write,)输出一段文本,多个参数将被连接成单个字符串文本。并在文本未尾追加一个换行符(

    *注1:write()与writeln()在浏览器中是Document对象的方法。为遵循这一惯例,在本书的所有测试范例中并不直接使用这两个方法。但这里保留了它们,以描述宿主环境的标准输入输出。

    对于不同的宿主来说,这些方法依赖于不同的对象层次的“顶层对象(或全局对象)”。例如浏览器宿主依赖于Window对象,而WSH宿主则依赖于WScript对象。但在本书中,调用这些方法时将略去这个对象。因此,至少它看起来很像是Global对象上的方法(事实上,大多数的宿主默认“顶层对象”不需要使用全名的约定)。

    下面的代码说明在具体的宿主环境中如何实现本书所适用的alert()方法。例如:

    // 示例1: .NET Framework中的JScript 8.0,(当前的)顶层对象取决于import语句
    // (注: JScript.NET中的脚本需要编译执行)
    import System.Windows.Forms;
    function alert(sMessage) {
    MessageBox.Show(sMessage);
    }
    alert('Hello, World!')

    // 示例2:浏览器环境中使用的顶层对象是window
    alert('Hello, World!');

    // 示例3:WSH环境中使用的顶层对象是WScript, 但必须使用全名
    function alert(sMessage) {
    WScript.Echo(sMessage);
    }
    alert('Hello, World!');

  • 相关阅读:
    WebRTC的一个例子
    Gerrit增加SSL证书
    Ruby on Rails 创建https应用
    使用Ruby来实现批量更新AD中字段
    pg gem 安装(postgresql94)
    Spark源码剖析(一):如何将spark源码导入到IDEA中
    Scala入门系列(十三):类型参数
    Scala入门系列(十二):隐式转换
    Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
    Scala入门系列(十一):模式匹配
  • 原文地址:https://www.cnblogs.com/sniper007/p/3521386.html
Copyright © 2011-2022 走看看