1

NodeJSでプリミティブ文字列宣言を監視する方法はありますか?たとえば、私がそうするとき、パラメータとして"test";特別なイベントをトリガーする方法はありますか?"test"

4

2 に答える 2

2

「テスト」を行うとはどういう意味かわかりません。; ただし、変数に新しい値が割り当てられるたびにイベントをトリガーする場合は、いいえ、変数の変更に対してイベントをトリガーする方法はありません。

変数を監視する場合は、変数を割り当てるのではなく、呼び出しを行うようにシステムを再設計することをお勧めします。行う代わりに:

running_mode = "test";

必要とする

switch_mode("test");

この更新でトリガーするイベントハンドラーを呼び出します。

グローバル変数の値を本当に監視したい場合は、メインループのすべてのターンで値をチェックすることでそれを行うことができます。

function is_mode_changed() {
   if (running_mode=="test") event_handler();
   process.nextTick(is_mode_changed);
}

この関数を呼び出すと、メインループが1回転するたびに実行が継続されます。グローバルカウンターをフォローし、カウンターが1000に達するたびにクリーンアップタスクを実行するなど、特定のタスクを時々実行するために変数をフォローするようなものである場合、これは良い方法です。変数が変更された直後に何かをしたい場合、それは不可能です。

私はあなたの質問を正しく理解できたと思います。

アップデート

[私はそれを誤解していたので、上記のすべてを質問とは無関係にした以下のコメントに関してこれを追加しています。]

あなた自身が言ったように、のような文字列リテラル"test"はオブジェクトではないプリミティブ値です。したがって、それは私たちが変更できない方法でインタプリタによって処理されます。

Ecma-262から:

4.3.2プリミティブ値

タイプ、、、、、または条項8Undefinedで定義されているもののいずれかNullのメンバーBooleanNumberString

注:プリミティブ値は、言語実装の最下位レベルで直接表されるデータです。

混乱を避けるために、条項8は、上記のタイプに関する標準のセクションです。

于 2012-07-02T01:33:17.713 に答える
1

仕様ごとのECMAScriptではなくV8を指定したため、より具体的なオプションを自由に使用できます。V8 APIには、プリミティブのオブジェクトラッパーとは別のクラス/テンプレートまたはプリミティブがあります。これが実際にいつ発生するかを知る方法でフックできるようにするには、カスタムの方法でv8を変更する必要がありますが、それは実行可能です。

http://code.google.com/p/v8/source/browse/branches/bleeding_edge/include/v8.h#1017

また、アクションの多くはjs自体で行われます。おそらくコンストラクター自体ではなく、その後に発生するすべてのものです。String.prototype.toString/valueOf。

http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/string.js

于 2012-07-04T06:33:20.103 に答える