0

JavaScriptでは、プログラムの実行全体を通して条件が真のままであるかどうかをテストすることは可能ですか?ここでは、プログラムの開始から終了まで、変数aが常に3で割り切れるようにします。

//Assert that the following is always true, and print an error message if not true
ensureAlwaysTrue(a % 3 == 0); //print an error message if a is not divisible by 0
                              //from this point onward

a = 6;

a = 10 //print error message, since a % 3 != 0

function ensureAlwaysTrue(){
    //this is the function that I'm trying to implement.
}

1つの解決策は、すべての変数割り当ての後にアサーションをチェックするステートメントを追加することですが、それは冗長で面倒です。プログラムの実行中に条件が真であるかどうかを確認するためのより簡潔な方法はありますか?

4

4 に答える 4

2

いいえ。

Javascriptで最も近いのは、 AspectJ for Javaensureのように、コードを「コンパイル」して、すべてのステートメントの後に関数呼び出しを自動的に挿入するツールを見つけることです。

別の言語でそれを行う潜在的な方法は、バックグラウンド スレッドを使用することです。Javascript スレッド (Web ワーカー) は、他のスレッドの変数にアクセスできません。Javascript は、コードを順番に実行するインタープリター言語でもあります。ensure関数が実行パスに実際に存在しない限り、関数は実行されません。

于 2013-01-26T04:57:30.343 に答える
1

まあ、次のように時間間隔を追加できます

assertInterval = 10; //milisseconds

function ensureAlwaysTrue(condition)
{
    setInterval(function(){ if(!condition()) error(); }, assertInterval);
}

そして、あなたはそれを次のように呼びます:

var a = 6;

ensureAlwaysTrue(function(){return (a % 3 == 0);});

それはそれをキャッチしますが、最大assertIntervalミリ秒の遅延があります。

編集: @Chris が指摘したように、実際には機能しません:「あなたの間隔関数は、現在実行中の関数のステートメント間で実際には実行されません」。確かに、イベント間などでアサートする場合にのみ機能します。

于 2013-01-26T05:00:18.830 に答える
0

@Chris (http://stackoverflow.com/a/14534019/1394841) のアイデアに基づいて、コード全体を文字列で囲み、次のようにすることができます。

function ensureAlwaysTrue(condition, code)
{
    var statements = code.split(";");
    for (var i = 0; i < statements.length-1; i++) { //last statement is empty
        eval(statements[i] + ";");
        if (!condition()) error();
        //break; //if desired
    }
}

var code =
"a = 6;\
a = 10; //print error message, since a % 3 != 0\
";

ensureAlwaysTrue(function(){return (a % 3 == 0);}, code);
于 2013-01-26T05:22:06.167 に答える