2013-02-13 4 views
6

ディレクトリの下にあるsrcディレクトリの下にいくつかのjsファイルがあり、Math、Arrayなどの基本的なJSオブジェクトを提供していました。これらのファイルをブラウズすると、 %)を返します。つまり、%Fooです。私は最初JSの識別子の中で他に許された文字だと思っていましたが、シェルで試してみると、私は構文規則に違反していると叫んでいました。しかし、構文エラーの場合、d8はどのように動作しますか?ここで、実際のソースコードの例である:%記号を識別子に使用するには

SRC/apinatives.js線44〜47、githubの/ V8/V8

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

SRC/apinatives.js線41からgitのクローン43、githubの/ V8/V8

からgitのクローン
function SetConstructor() { 
    if (%_IsConstructCall()) { 
    %SetInitialize(this); 

この識別子は、構文エラーが得られませんどのように来ます。 math.jsとstring.jsを含むすべてのjsファイルと他のすべてのファイル:wq

+1

'% 'は[モジュラス演算子](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Arithmetic_Operators)です。それは何かをテストすることです*、私は何がわかりません。 –

+1

@DavidThomasどのように '!%IsTemplate(data)' –

+0

'' IsTemplate(data) 'から返されるものに正確に依存しています。 –

答えて

15

これは、技術的に有効なJavaScriptではありません。これらはV8 runtime functionsへの呼び出しです。そのページから:JavaScriptライブラリの

多くは JavaScriptから呼び出し可能なC++ランタイム関数の最小セットを使用して、JavaScriptコード 自体に実装されています。これらのうちのいくつかは、%、 で始まり、フラグ "--allow-natives-syntax"を使用して呼び出されます。他は、コード生成プログラムによって生成された コードによってのみ呼び出され、JSでは表示されません。 でも%構文を使用します。

あなたはparser.ccに見える場合は、パーサはV8は、そのランタイムと対話するために使用されるJavaScript言語にこの拡張機能を受け入れるかどうかを決定allow_natives_syntaxに関連するいくつかのコードを見ることができます。これらのファイルは、そのオプションを有効にして解析する必要があります。

私は、V8ではデフォルトでこれらの呼び出しを行うことができないと考えています。なぜなら、JavaScript標準と矛盾し、おそらく実行できないようにするためです。

+0

お返事ありがとうございました! –

-1

javascriptで "%"を使用すると単項演算子として使用できないし、文字として使用することもできません変数名または関数名。 "%"は、引用符で囲まれていない限り、javascriptのモジュラス演算子としてのみ使用できます。

Googleのv8のjavascriptエンジンはJavaScriptのファイルを何らかの形で前処理しているようですが、%functionName()構文はjavascriptエンジンで実行される前にjavascriptファイルを前処理するために使用されるマクロです私はバイナリをビルドするためにC++を使用するjavascriptエンジンコードベースのjavascriptファイルをGoogleが持っている理由をよく知らない。

+1

私は 'js2c 'を見つけました。ソースツリーのtoolsディレクトリの下に「py」と表示されます。このプログラムは、(関連ファイルのコードコメントで)次のことを行うように指示されます。>これは、JavaScriptソースコードをCスタイルのchar配列に変換するためのユーティリティです。これは、V8ライブラリーの組み込みJavaSCriptコードに使用されます。 –

+1

'%'は、[モジュロ演算子](http://www.adobe.com/go/warning)ではなく、[剰余演算子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder) /wiki.ecmascript.org/doku.php?id=strawman:modulo_operator)。小さくても重要な違いです。 –

関連する問題