1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
---
title: Rhino overview
slug: Mozilla/Projects/Rhino/Overview
translation_of: Mozilla/Projects/Rhino/Overview
---
<h3 id="Introduction" name="Introduction">简介</h3>
<p>大多数用过 <a href="/en/JavaScript" title="en/JavaScript">JavaScript</a> 的人都是将js脚本放入<a href="/en/HTML" title="en/HTML">HTML</a>页面中使用。然而, Rhino 仅仅是对javascript核心部分的实现,并没有包含操作HTML的对象或方法。</p>
<p>Rhino 包括</p>
<ul>
<li> <a href="/en/New_in_JavaScript_1.7" title="en/New_in_JavaScript_1.7">JavaScript 1.7</a>的全部特性</li>
<li>可以用脚本方式调用Java</li>
<li>用一个<a href="/en/Rhino/Shell" title="en/Rhino/Shell">JavaScript Shell</a>来执行JavaScript脚本</li>
<li>用一个<a href="/en/Rhino/JavaScript_Compiler" title="en/Rhino/JavaScript_Compiler">JavaScript编译器</a> 来将JavaScript脚本文件转换成Java类文件</li>
<li>用一个<a class="external" href="http://www.mozilla.org/rhino/debugger.html">JavaScript调试器</a> 来调试Rhino执行的脚本</li>
</ul>
<h3 id="Language" name="Language">语言</h3>
<p>JavaScript 的标准是 <a class="external" href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">Standard ECMA-262 ECMAScript: A general purpose, cross-platform programming language</a>. Rhino 1.3 及以上版本遵照上述标准的第3版。</p>
<p>Rhino 1.6 及以上版本实现了 <a class="external" href="http://www.ecma-international.org/publications/standards/Ecma-357.htm">ECMA-357 ECMAScript for XML (E4X)</a> 标准. 查看详细的规格说明可以获得更多的信息,查看 <a class="external" href="http://www.mozilla.org/rhino/rhino16R1.html#E4X">Rhino version 1.6R1 release notes</a> 可以看到Rhino对标准实现的具体情况。</p>
<p>此外,Rhino实现了JavaAdapters,这样我们可以用一个JavaScript对象来实现任何java的接口或者继承任何java的类。查看下载文件中example文件夹中的<code class="filename">enum.js获取更多的信息。</code>.</p>
<p>有很多JavaScript的书和教程。 我们推荐<a class="external" href="http://www.oreilly.com/catalog/jscript5/">JavaScript: The Definitive Guide</a> 这本书,里面有一章是说Rhino的。</p>
<h3 id="Deprecated_Language_Features" name="Deprecated_Language_Features">废弃的语言特性</h3>
<p>很多在JavaScript 1.2中定义的特性已经被废弃了. 这些特性允许“计算反射”:可以决定和影响它被评价方法等方面的能力。 这些特性没有被广泛使用,他们对阻碍和防止优化的行为强加了重要的约束。 这些被废弃的特性是 <code>__proto__</code> 和 <code>__parent__</code> 属性, 还有构造函数 <code>With</code>,、<code>Closure<font face="Open Sans, sans-serif"><span style="line-height: 21px;">和</span></font></code><code>Call。</code>在JavaScript 1.4中使用这些特性会产生错误。在其他的版本中使用这些特性,会产生警告。</p>
<h3 id="Internationalization" name="Internationalization">国际化</h3>
<p>The messages reported by the JavaScript engine are by default retrieved from the property file <code class="filename">org/mozilla/javascript/resources/Messages.properties</code>. If other properties files with extensions corresponding to the current locale exist, they will be used instead.</p>
<h3 id="JavaScript_Language_Versions" name="JavaScript_Language_Versions">JavaScript语言版本</h3>
<p>JavaScript引擎的很多行为与语言的版本有关。在浏览器调用中,JavaScript版本的选择是通过script标签中的LANGUAGE属性定义的,比如"JavaScript1.2"。</p>
<p>1.3 和更高版本是ECMA一致的。</p>
<h4 id="Operators_.3D.3D_and_.21.3D" name="Operators_.3D.3D_and_.21.3D">操作符 <code>==</code> 和 <code>!=</code></h4>
<p>1.2版本用 <code>==</code> 和 <code>!=</code> 来处理绝对相等的问题。 在1.3或更高的版本里, <code>==</code> 和 <code>!=</code> 和ECMA中所描述的一样。 操作符 <code>===</code> and <code>!==</code> 在所有版本中都表示绝对相等。</p>
<h4 id="ToBoolean" name="ToBoolean">布尔转换</h4>
<p><code>1.3之前的所有版本Boolean(new Boolean(false))</code> 值为<code>false</code> 。在1.3及1.3之后,它的值为<font face="Courier New, Andale Mono, monospace"><span style="line-height: normal;">true。</span></font></p>
<h4 id="Array.prototype.toString_and_Object.prototype.toString" name="Array.prototype.toString_and_Object.prototype.toString"><code>Array.prototype.toString 和 Object.prototype.toString</code></h4>
<p>1.2版本只是返回数组或对象的文字符号 (比如<code>"{{ mediawiki.external(1,2,3) }}"</code> or <code>"{a:1, b:2}"</code> )。 在1.3或更高版本中这些函数与ECMA标准一致。</p>
<h4 id="Array_constructor" name="Array_constructor"><code>Array</code> 构造函数</h4>
<p><code>只有在1.2版本中,Array(<var>i</var>)</code> 用一个参数i构造一个只有一个元素且元素的值为i的数组。 在其他版本中,使用和ECMA一致的标准 (一个没有元素的数组被构造,长度为i)。</p>
<h4 id="String.prototype.substring" name="String.prototype.substring"><code>String.prototype.substring</code></h4>
<p>只有在1.2版本中, 如果第一个参数小于第二个参数,两个参数不会互换。其他的版本都符合ECMA标准。</p>
<h4 id="String.prototype.split" name="String.prototype.split"><code>String.prototype.split</code></h4>
<p>只有对1.2版本,split按照Perl4的特例当用一个单独的空格字符作参数时, (跳过最先的空白,用空白分割). 其他的版本完全按照ECMA的标准分割。</p>
<h3 id="Security" name="Security">安全</h3>
<p>Rhino的安全特性提供了找到代码片段的来源的功能 (还有任何会轮流产生的代码片段)。这些特性考虑到了传统的基于URL的安全策略(在网景领航员中的JavaScript)的实现。执行信任的JavaScript代码时可以不考虑安全性特征。</p>
<p>运行不被信任的JavaScript代码时,需要做两件事来保证安全性。第一,每一个被创建的Context必须被提供一个实现SecuritySupport接口的实例。 这样在功能上给Rhino提供了让它执行安全相关任务的支持。</p>
<p>第二, <code>security.requireSecurityDomain属性的值应该被改为</code><code>true在资源束</code>bundle <code>org.mozilla.javascript.resources.Security中</code>. 这个属性的值可以在运行时通过调用<code style="font-size: 14px;">Context<font face="Open Sans, sans-serif"><span style="line-height: 21px;">的</span></font></code><code style="font-size: 14px;">isSecurityDomainRequired方法来决定。将这个属性设置为ture,要求任何编译或评估JavaScript的调用必须提供一个安全区域对象(任意类型),用来标识JavaScript代码。在一个典型的客户端嵌入中,这个对象可能是提供javascript的服务器的URL,或者是一个包含代码片段的签发人的代表(用于基于证书的安全策略)。</code></p>
<p>当JavaScript代码想要执行一个受限制的行为时,安全区域会被后面的方法检索。类上下文会从安全管理(<code>java.lang.SecurityManager.getClassContext())中得到。执行限制行为的代码对应的类</code> 可以通过寻找一个在类上下文中合适的位置得到。如果调用者是JavaScript,得到的类可能是一种或两种类型。首先,它可能是解释器(如果解释器模式有效)。第二,它有可能是一个生成的类,如果类文件生成支持。一个植入可以区分两种情况,通过调用在Context Class中调用<code>isInterpreterClass()。</code> 如果是解释器类,调用Context的<code>getInterpreterSecurityDomain()</code> 方法来获取当前正在执行的被解释的脚本或方法的安全区域。否则,就是一个生成的类,一个嵌入可以调用在实现<span style="font-family: courier new,andale mono,monospace; line-height: normal;">SecuritySupport的类中调用</span><code style="font-size: 14px;">getSecurityDomain()。当类被定义而且被打开,恰当的安全区域和它建立关联,而且可以通过调用这个方法找回。一旦安全区域被决定,一个植入可以执行任何检查者适合去决定是否允许去做的操作。</code></p>
<p>{{ languages( { "ja": "ja/Rhino_Overview" } ) }}</p>
|