6

浏览v8树,在src目录下,有一些 js 文件,提供一些基本的 JS 对象,如 Math、Array 等。浏览这些文件,我看到标识符中包含百分号 (%),即%Foo. 我一开始天真地以为这是 JS 标识符中允许的其他字符,但是当我在 shell 中尝试时,它对我大喊大叫,说我违反了语法规则。但如果是语法错误,那么 d8 是如何工作的呢?以下是来自实际源代码的示例:

src/apinatives.js 第 44 到 47 行,来自 github/v8/v8 的 git clone

function Instantiate(data, name) {
  if (!%IsTemplate(data)) return data;
      var tag = %GetTemplateField(data, kApiTagOffset);
      switch (tag) {

src/apinatives.js 第 41 到 43 行,来自 github/v8/v8 的 git clone

function SetConstructor() {
  if (%_IsConstructCall()) {
    %SetInitialize(this);

为什么这个标识符不会产生语法错误。所有 js 文件,包括 math.js 和 string.js 以及所有其他文件?:wq

4

1 回答 1

19

它在技术上不是有效的 JavaScript。这些是对 V8运行时函数的调用。从该页面:

大部分 JavaScript 库是在 JavaScript 代码本身中实现的,使用可从 JavaScript 调用的最小 C++ 运行时函数集。其中一些使用以 % 开头的名称并使用标志“--allow-natives-syntax”来调用。其他的仅由代码生成器生成的代码调用,在 JS 中不可见,即使使用 % 语法也是如此。

如果你看一下,parser.cc你会看到一些与它相关的代码,allow_natives_syntax它决定了解析器是否会接受这个对 V8 用于与其运行时交互的 JavaScript 语言的扩展。必须在启用该选项的情况下解析这些文件。

我推测 V8 默认情况下不允许您进行这些调用,因为它与 JavaScript 标准相矛盾,并且因为它可能允许您对运行时执行您不应该执行的操作。

于 2013-02-13T21:42:38.967 回答