1

数日前、外部スクリプトの実行途中で関数のコードを動的に変更することについて質問したところ、その概念に出くわすことは完全に忘れるように言われました。それがなぜなのか、よくわかりません。例を挙げましょう:

<script>
var display = function(msg)
 {
alert(msg);
 }

// Now, at the moment, the display() function
// is receiving a single parameter and alerting
// it to the user. I'm now going to use eval()
// to modify the display() function.

eval('display = ' + display.toString().replace('alert(', 'document.write('));

// Now, the display() function writes its parameter
// to the document as opposed to alerting it.
</script>

これはかなり些細な例だと思いますが、関数を動的に変更できることから派生できる用途がきっとあるはずです。それ自体が非常に便利です。

4

4 に答える 4

8

これで必要なことはできるかもしれませんが、今から 6 か月後には、あなた (またはあなたのコードを保守している人) は「なんてこと?!」となるでしょう。

ユースケースが何らかの条件に基づいてアラートまたは書き込みを行うことである場合、2 つの異なる関数を作成してみませんか? または、出力モードを決定する別のパラメーターを関数に持たせます。または、実際の出力を実行するパラメーターとして関数を渡します。何か、ご存知のように、もう少し正気です。;-)

于 2009-01-28T07:08:19.070 に答える
5

関数の動作を変更すると便利な場合もありますが、それを行うためのより良い方法があります。あなたの例では、関数を引数として渡すことで、出力を異なる方法で処理する関数の新しいインスタンスを作成できます (戦略パターンと同様)。

function makeDisplay(displayStrategy) {
    return function(msg) {
        // I'm assuming you would do some additional processing here...

        displayStrategy(msg);
    }
}

var display = makeDisplay(alert);

// now modify display to use document.write
display = makeDisplay(function(msg) { document.write(msg); });
于 2009-01-28T07:05:54.800 に答える
0

まあ、使用evalはセキュリティ上の問題かもしれませんが、関数をリアルタイムで変更することは問題ありません。とにかく、他にどのようにメモ化を行うことができますか?

考えてみれば、メソッド シグネチャを変更することは良い考えではありませんが、実行順序に依存するため、通常は追跡するのが容易ではないため、他の人はこの関数を後で呼び出す方法を知りません。

于 2009-01-28T06:58:20.073 に答える