【问题标题】:Can IE interpret both JScript and JavaScript?IE 可以同时解释 JScript 和 JavaScript 吗?
【发布时间】:2011-07-22 13:49:21
【问题描述】:

IE 的window.setTimeout 引用表明setTimeout 有一个可选的第三个参数来定义语言。

可能的语言是 JScript、VBScript 和 JavaScript。

我已经知道 IE 可以解析 VBScript 但是

IE 解析 JavaScript 与 JScript 有何不同?

我个人认为 IE 解析和运行的 EcmaScript 方言叫做 JScript。

[编辑]

正如人们所提到的,微软似乎将他们的 ES3 引擎标记为“JScript”,将他们的 ES5 引擎标记为“JavaScript”。 ES5 引擎在 IE9 中。

我们可以通过将"JScript" 传递给setTimeout 来在IE9 中使用他们的ES3 引擎吗?

【问题讨论】:

  • 这个问题让我印象深刻,相当于询问 Chrome 是否可以运行“V8 脚本”,但也许我只是被微软的古怪术语弄糊涂了
  • @dtanders 我将 JavaScript 解释为 ES 引擎的 Mozilla 实现。 IE 中可能隐藏了一个额外的解释器。
  • @dtanders:如果您查看 MSDN 链接,它确实分别列出了“JScript”和“JavaScript”,并且页面上没有任何地方说它们是同义词(这只是以我的经验,带有 MSDN 文档的课程;spotty 没有说一半)。

标签: javascript internet-explorer javascript-engine


【解决方案1】:

我个人认为 IE 解析和运行的 EcmaScript 方言叫做 JScript。

是的。第三个参数的“JScript”和“JavaScript”值只是同义词。我找不到它的参考资料,但你可以肯定 IE 没有两个独立的解释器,一个有 JScript-isms,一个没有。

这就是证据:如果你在 IE9 (live copy) 中运行它:

HTML:

<input type='button' id='btnJScript' value='JScript'>
<input type='button' id='btnJavaScript' value='JavaScript'>

JavaScript:

window.onload = function() {

  document.getElementById('btnJScript').onclick = function() {
    testIt("JScript");
  };
  document.getElementById('btnJavaScript').onclick = function() {
    testIt("JavaScript");
  };

  function testIt(lang) {
    var s = "var a = [1, 2, ]; display(a.length);";
    display("Calling <code>setTimeout</code> with <code>'" +
            s + "', 0, '" + lang + "'</code>");
    setTimeout(s, 0,lang);
  }
};

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = msg;
  document.body.appendChild(p);
}

在这两种情况下,您都会得到由 eval'd setTimeout 字符串显示的输出“2”。但是在 JScript 中,即使是 IE8 中的最新版本,尾随逗号意味着数组有三个条目,而不是两个。 Details on that here. 因此,IE9 在这两种情况下都使用其最新的解释器,如果您将“JScript”作为第三个参数传递,不会以某种方式降级为“JScript”。

更新:同样(我刚刚启动了我的 IE8 机器),如果您在 IE8 上运行此程序,两种情况都会得到“3”。

【讨论】:

  • 如果旧版本碰巧有一个完整的 JavaScript 解释器以及 JScript,我会很棒。那是最好的。
  • 就IE而言,它们是一回事。
  • ps:这个版本 (jsbin.com/idazuh/4) 表明 EcmaScript 是 Javascript 的另一个同义词,在 setTimeout() fn 中。此外,它表明 FredScript 不是一种语言的合法名称。
【解决方案2】:

this MSDN page 可以看出,JScript 是微软对其 ECMAScript 3 实施的名称,而 JavaScript 是其在 IE9 中出现的 ECMAScript 5 实施的名称。

【讨论】:

  • 是否意味着在 IE9 中我可以通过调用 window.setTimeout("var Run_AS_JScript = 42", 0, "JScript") 来运行 JScript 代码的 sn-p ?
  • 此答案不正确,或者至少具有误导性。 MSDN 页面没有声明字符串“Javascript”指的是 IE9/ES5 实现。它仅提供了 Javascript-in-IE9 文档的链接,它是 ES5 的实现。更准确的说法是:在IE9中,'Javascript'指的是ES5。你也可以在IE8中使用字符串'Javascript',它不使用ES5实现。这对某些人来说可能很明显,但值得澄清。
  • 另外:虽然 MS 没有记录它,但我们可以有把握地假设 &lt;script&gt; 标签的语言 attr 中使用的字符串以及 setTimeout 中使用的字符串是 ProgIds。它们是 Windows 注册表中引用 COM CLSID 的字符串。这与您可以在 cscript.exe 的 cmd 行中使用 //E 相同。 JScript 和 Javascript 指向完全相同的 CLSID,相同的对象。 IE9 可能对术语“Javascript”有特殊处理,它查找不同的 CLSID。据我所知,这些都没有记录。这只是我通过观察和测试得出的结论。
【解决方案3】:

我猜是我能给出的最佳答案,其他人已经这样做了。

众所周知,Resig 先生本人:http://ejohn.org/blog/versions-of-javascript/

sn-p

  • IE 6-7 支持 JScript 5(相当于 ECMAScript 3、JavaScript 1.5)
  • IE 8 支持 JScript 6(相当于 ECMAScript 3、JavaScript 1.5 - 比 JScript 5 修复了更多错误)
  • Firefox 1.0 支持 JavaScript 1.5(ECMAScript 3 等效)
  • Firefox 1.5 支持 JavaScript 1.6(1.5 + Array Extras + E4X + misc.)
  • Firefox 2.0 支持 JavaScript 1.7(1.6 + Generator + Iterators + let + misc.)
  • Firefox 3.0 支持 JavaScript 1.8(1.7 + 生成器表达式 + 表达式闭包 + 其他)
  • Firefox 的下一个版本将支持 JavaScript 1.9(1.8 + 待定)
  • Opera 支持相当于 ECMAScript 3 + Getters and Setters + misc 的语言。
  • Safari 支持相当于 ECMAScript 3 + Getters and Setters + misc 的语言。

我猜 IE9 的 JScript 引擎 (Chakra) 尽可能接近“Javascript”。但是,它支持 ES5 的许多特性。请参阅“IE9 Javascript engine”。所以我们可能可以用

来扩展上面的列表
  • IE9 支持 JScript 9(相当于 ECMAScript 5、JavaScript 1.8.5)

【讨论】:

  • 这与问题完全无关,不是吗;)澄清一下。我知道 JScript 和 JavaScript 之间的区别。将这些值传递给setTimeout有什么区别
  • @Raynos:“完全不相关”,你在开玩笑吗?
  • @jAndy 这不是无关的,但它不能回答我的问题。
  • @jAndy JScript 7 和 8 是 JScript.NET。 IE9 使用 JScript 9。
  • @Raynos:不知道。可以给我这个的来源吗,很感兴趣。
【解决方案4】:

您可以放心地认为 JScript 与 JavaScript 相同,不会遇到任何问题。

http://en.wikipedia.org/wiki/JScript#Comparison_to_JavaScript

【讨论】:

  • 为什么?请说明参考。
【解决方案5】:

JScript 和 Javascript 在 IE 中是一样的东西。 JScript 在 IE9 中被重命名为 JavaScript,因为实现更标准(或更好、更可互操作)。

【讨论】:

    【解决方案6】:

    您引用的手册页指出sLanguage 是一个参数,可以采用值VBScriptJScriptJavascript

    并不是说 JScript 与 Javascript 不同,只是两者都是同一种语言的有效名称,它们需要同时支持这两个名称。

    JScript 是微软对 Javascript 的逆向工程克隆的名称。这些语言现在已经被 ECMA 的标准化工作合并,产生了 EcmaScript,尽管它通常仍被称为 Javascript。

    但微软需要同时支持这两个名称,因为他们希望保持与为仍然使用旧 JScript 名称的旧版本 IE 编写的旧代码的兼容性。

    【讨论】:

    • 我明白了。正确的名称是“JavaScript”。 “JScript”仍在列表中以实现向后兼容性
    • @Raynos - 是的,就是这样。
    • 澄清一下,“JavaScript”是 AOL 或 Mozilla 拥有的商标术语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2013-02-17
    • 1970-01-01
    • 2011-01-16
    • 2016-11-21
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多