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

6 javascript syntax v8 identifier

浏览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) {
Run Code Online (Sandbox Code Playgroud)

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

function SetConstructor() {
  if (%_IsConstructCall()) {
    %SetInitialize(this);
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*ard 18

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

许多JavaScript库都是在JavaScript代码本身中实现的,使用可从JavaScript调用的最小C++运行时函数集.其中一些使用以%开头的名称调用,并使用标志"--allow-natives-syntax".其他只由代码生成器生成的代码调用,并且在JS中不可见,即使使用%语法也是如此.

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

我推测V8默认情况下不允许你进行这些调用,因为它会违反JavaScript标准,因为它可能允许你对运行时做一些你不应该做的事情.