在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
答案 0 :(得分:17)
这在技术上不是有效的JavaScript。这些是对V8 runtime functions的调用。从该页面:
许多JavaScript库都是用JavaScript代码实现的 本身,使用可调用的最小C ++运行时函数集 JavaScript的。其中一些是使用以%开头的名称来调用的, 并使用标志“--allow-natives-syntax”。其他人只被称为 由代码生成器生成的代码,甚至在JS中也不可见 使用%语法。
如果查看parser.cc
,您可以看到与allow_natives_syntax
相关的一些代码,这些代码确定解析器是否接受V8用于与其运行时交互的JavaScript语言的此扩展。必须在启用该选项的情况下解析这些文件。
我推测V8默认情况下不允许你进行这些调用,因为它会违反JavaScript标准,因为它可能允许你对运行时做一些你不应该做的事情。