0

アイデアは次のとおりです。関数内で入力が重要な順序を変更できるようにしたいのです。通常の関数が次のように見えるとしましょう。

var f = function(a,b,c,d){
    return a * b / c + d;
}

関数を再定義できるようにしたいので、ユーザーがf(w,x,y,z)変数(言うとしましょうchanged)がtrueの場合に呼び出すと、ユーザーが呼び出したように動作しますf(w,z,y,x)! (特に逆順ではなく、元の関数とは順序が異なるだけです)

そのように動作する別の関数を書きたい場合は、次のようにできます。

var newF = function(a,b,c,d){
    if(changed === true){
        return f(c,d,b,a);
    }
    else{
        return f(a,b,c,d);
    }
}

fすべての呼び出しを呼び出しに置き換えますnewFが、それは私が求めていることではありません。

実際の関数と同じ名前の関数を再定義することは可能ですか?それはどのように行われますか? できない場合は、その理由を説明してください。

説明:

私がこれをやりたい理由は、すべてを自然に聞こえるようにする機能を持つアプリがあるためです (線の点が直線になるなど) が、値の一部を切り替えると、楽しく非現実的な状況が作成され、これは実装するのが楽しいオプションだと思いました。上記の私のオプションは実行可能であり、使用できますが、同じ関数名内に保持できるかどうか疑問に思っていました

4

5 に答える 5

4

実際の関数と同じ名前の関数を再定義することは可能ですか?それはどのように行われますか?

はい、その識別子に再度割り当てることができます:

f = function(a,b,c,d) {
    if (changed)
        return a * d / c + b;
    else
        return a * b / c + d;
};

内容が正確にわからないために実際の関数を呼び出す必要がある場合 (ただし、そのパラメーターをインターセプトしたい場合)、次のことができます。

f = (function(oldF) {
    return function(a,b,c,d){
        if (changed)
            return oldF(c,d,b,a);
        else
            return oldF(a,b,c,d);
    };
})(f);
于 2013-07-03T14:54:24.890 に答える
2
var oldF = f;

f = function( ... ){
    // do stuff
    oldF(...);
};
于 2013-07-03T14:53:55.520 に答える
1

実行時に正しい関数を返すファクトリ メソッドを使用します。

于 2013-07-03T14:54:08.497 に答える
0

「なぜしたいのか」は別として、次のようなことができます。

var changed = false;

var f = function(a,b) {
    console.log("original function: " + a + "," + b);
}

f = (function(original) {
    return function(a,b) {
        console.log("new function");
         if (changed) {
             console.log("order changed");
             original(b,a);
         }
         else {
              original(a,b);
         }
     }
})(f);

f(1,2);
changed = true;
f(1,2);

出力します(コンソールで):

new function 
original function: 1,2 
new function 
order changed 
original function: 2,1 

フィドル

于 2013-07-03T15:00:47.097 に答える
0

まず、次のような関数を定義していればOKです:

var f = function(...){...};

その後、簡単にオーバーライドできます。しかし、これを行うと:

function f(...){...}

簡単に説明するとfunction f(...){...、コンパイラで関数を宣言すると、宣言されたすべての関数が最初に検索され、コードが実行されます。一方、変数 f として宣言すると、前処理中ではなく実行時に関数が保存されます。したがって、次のように宣言します。

function f(){
    console.log('a');
};
f();
function f(){
    console.log('b');
}

f();

出力しますb bフィドル このようにしながら:

var f = function () {
    console.log('a');
};
f();
f = function () {
    console.log('b');
}

f();

出力しますa bフィドル

JS は型と引数のサイズを気にしないため、例の中に引数を入れることはありません。imoが次のようにするのが最善の方法です:

var myProject = {};

myProject.fn = {

    f: function(args,options){
        //in your case while you need a,b,c,d you can use the args array to store them
        //options to define the 'changed' thing or whatever you need
        }

}
于 2013-07-03T14:55:43.220 に答える