1

私は SpiderMonkey C API を使用しており、その API を使用して C でクロージャを実装したいと考えています。実装したいものはかなり複雑ですが、次のような単純なものを行う方法さえわかりません。

function x() {
   var i = 0;
   return function() { i++; print(i); };

}

var y = x();
y(); //1
y(); //2
y(); //3 

誰かが私がこれを行う方法を知っているかどうか疑問に思っていました。JS_NewFunction メソッドを見つけましたが、それが正しい方向への一歩であるかどうかは実際にはわかりません。どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

0

1年後、おそらくまだ興味があるかのようにナレーションされます。

JS_GetParentのドキュメントで眉を激しく編んでいると思います

一部の関数では、字句スコープを実装するために使用されます(ただし、これは実装の詳細です)。

次に、関数を作成するAPI関数のリストとともに、

これらの関数の一部を使用すると、アプリケーションで親オブジェクトを指定できます。オブジェクトを作成するJSAPI関数に親パラメーターがあり、アプリケーションがそれにnull以外の値を渡す場合、そのオブジェクトは新しいオブジェクトの親になります。それ以外の場合、コンテキストがスクリプトまたは関数を実行している場合は、それらに基づいてデフォルトの親オブジェクトが選択されます。

後でこれを試すかもしれませんが、スコープを持たせたい関数の実行中にAPIで関数を(単に)作成することで、これを実行できる可能性があります。

それ以外の場合は、 JS_SetParentを使用して関数の字句スコープをオブジェクトに手動で設定できる可能性がありますが、ドキュメントでは、親の使用を不吉に「内部」と呼んでいます。

</necro>
于 2010-10-13T20:03:37.593 に答える
0

クロージャーを行う純粋なCの方法があるかどうかはわかりません。ただし、可能であれば、必要な機能を JavaScript で実装し、JavaScript テキストを JSAPI で評価することをお勧めします。そこから、JSAPI を使用して、ホスト機能を実装するために必要なハンドル/変数を取得します。JSAPI を使用して JavaScript の処理を​​行うのは非常に面倒です。できれば避けてください。

于 2009-02-09T05:41:27.647 に答える