0

複雑な関数を再利用しようとしていますが、その関数内の条件内にあるローカル変数の値を変更できれば完璧に機能します。

要約するには:

var func = complicated_function() {
    // lots of code
    if (something) {
        var localvar = 35;
    }
    // lots of code
}

localvar を別の数値にする必要があります。

関数自体を実際に変更せずに、localvar を別のものに割り当てる方法はありますか?

更新:答えはイエスです! 以下の私の回答を参照してください。

4

6 に答える 6

1

関数自体で実際に何も変更せずに、localvarを他の何かに割り当てる方法はありますか?

いいえ。

于 2011-08-31T13:35:08.317 に答える
1

いいえ。ただし、関数のシグネチャ(基本的には必要な入力と出力)が変更されないように、条件付きで割り当てることができます。パラメータを追加し、デフォルトで現在の値にします。

var func = complicated_function(myLocalVar) {
    // lots of code
    if (something) {
        // if myLocalVar has not been set, use 35.
        // if it has been set, use that value
        var localvar = (myLocalVar === undefined)?35:myLocalVar;
    }
    // lots of code
}
于 2011-08-31T13:36:26.990 に答える
1

いいえ。

複雑な関数を変更せずには方法がありません。javascript では call と apply を使用してこれを操作できます。複雑な関数で関数をオーバーライドしたり、オプションの場合は新規に追加したりできます (ただし、ローカル変数 localvar にアクセスすることはできません)。

これは楽しみのためです。私の本当の答えはまだいいえです。

あなたが夢中になっているなら:)

var complicatedFunction = function() {
  var i = 10;

  var internalStuff = function() {
    console.log(i); // 10 or 12?
  };

  return internalStuff();

};

var complicatedFunction;

eval("complicatedFunction = " + complicatedFunction.toString().replace(/i = 10/, 'i = 12'));

complicatedFunction(); //# => 12
于 2011-08-31T13:52:30.113 に答える
0

関数が使用する場合this.localvar

var func = function() {
    alert(this.localvar)
    if (true) {
        var localvar = 35;
    }
    // lots of code
    alert(this.localvar)
}
var obj = {localvar: 10}; 
func.call(obj); // alerts 10 twice

そうでない場合は、機能を変更せずに変更することはできません。

于 2011-08-31T13:36:58.913 に答える
0

私は約3週間前にこの質問をしましたが、30分以内に5つの回答が得られましたが、基本的には不可能だと言われました。

しかし、私は答えがイエスであることを発表できることを嬉しく思います、それは可能です!

方法は次のとおりです。

var newfunc = func.toString().replace('35', '42');
eval('newfunc = ' + newfunc);
newfunc();

もちろん、それはevalを使用します。これはおそらくそれが悪であるか、少なくとも非常に賢明ではないことを意味しますが、この特定のケースでは機能します。

于 2011-09-19T13:33:07.617 に答える
0

JavaScript 変数では、関数の先頭に「プッシュ」されます。JavaScript の変数には、C、C++、Java、および C# のような「中かっこ」スコープではなく、関数スコープがあります。

これは、あなた (開発者) が手動で一番上にプッシュしたのと同じコードです。

var func = complicated_function() {
   var localvar = 0;
   // lots of code
   if (something) {
       localvar = 35;
   }
   // lots of code
}

変数を 1 つの関数の「上」に宣言すると、役に立ちますか? 少なくとも宣言は分離されています。

function whatever() {
  var localvar = 0;

  var func = function() {
    var something = true;

    // lots of code
    if (something) {
        localvar = 35;
    }
    // lots of code
  };

 func();
 alert(localvar);
}
whatever();

これが jsFiddle です: http://jsfiddle.net/Gjjqx/

クロックフォードを参照してください。

http://javascript.crockford.com/code.html

JavaScript にはブロック スコープがないため、ブロックで変数を定義すると、他の C ファミリー言語の経験があるプログラマーが混乱する可能性があります。関数の先頭ですべての変数を定義します。

于 2011-08-31T13:43:05.357 に答える