如何在标识符中使用 % 符号

IT技术 javascript syntax v8 identifier
2021-02-28 08:28:51

浏览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

1个回答

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

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

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

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