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

时间:2013-02-13 20:59:56

标签: javascript syntax v8 identifier

src目录下浏览v8树,其中有一些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 个答案:

答案 0 :(得分:17)

这在技术上不是有效的JavaScript。这些是对V8 runtime functions的调用。从该页面:

  

许多JavaScript库都是用JavaScript代码实现的   本身,使用可调用的最小C ++运行时函数集   JavaScript的。其中一些是使用以%开头的名称来调用的,   并使用标志“--allow-natives-syntax”。其他人只被称为   由代码生成器生成的代码,甚至在JS中也不可见   使用%语法。

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

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