2

外部関数内の関数にローカルな変数に自由変数としてアクセスしようとしています。

これは私が達成しようとしているものです:

function try_evaluate() {
    var i = 0;
    show_r("i <= 10");
}

function show_r(expression) {
    if (eval(expression)) {
        i++;
        show_r(expression);
    } else alert(eval(expression));
}

iのスコープで変数が定義されていないため、エラーが発生しますshow_riグローバル変数の作成は機能しますが、ローカル変数にする必要がありますi

4

5 に答える 5

2

ではvar i、その変数は、それが定義されている関数のスコープ内でのみアクセスできます。同じスコープ内の無名関数はそれにアクセスできますが、外部で定義された関数への呼び出しにはアクセスできません。代わりに、変数を渡すか、両方のコンテキストで使用できるスコープで変数を定義する必要があります (たとえば、グローバル スコープですが、それを使用することはお勧めしません)。

また、あなたが具体的に何をしようとしているのかについても非常に警戒しています。何かをするために使用しなければならない場合、それはおそらく間違ったことです。eval

于 2013-03-12T02:23:56.020 に答える
1

これは、JavaScript の動的スコープが役立つようなものに思えます。次のStackOverflow スレッドを参照してください: Is it possible to Achieve dynamic scoping in JavaScript without resorting to eval?

これは私がすることです:

function try_evaluate() {
    var i = 0;
    var show_r_dynamic = eval("(" + show_r + ")");
    show_r_dynamic("i <= 10");
}

他のすべては同じままです。

function show_r(expression) {
    if (eval(expression)) {
        i++;
        show_r(expression);
    } else alert(eval(expression));
}

ここでデモを見ることができます: http://jsfiddle.net/53Qsu/

于 2013-03-12T03:42:02.903 に答える
1
function try_evaluate(){
    var i = 0;
    show_r(i);
}
function show_r(x){
    //console.log(eval.expression);
    if (x<=10){
       x++;
        console.log(x);
        show_r(x);
    } else {
        console.log(false);
    }       
}`

なぜあなたはevalをしているのですか?上記のコードで意図したことを達成できると思います。

于 2013-03-12T02:28:20.807 に答える
0

これはうまくいきます:

function try_evaluate(){
    var i = 0;
    show_r('$ <= 10', i);
    show_r('false', i);
}

function show_r(expression, i){
    if (eval(expression.replace('$', i))){
        i += 1
        show_r(expression, i);
    } else {
        alert(eval(expression.replace('$', i)));
    }       
}
于 2013-03-12T02:31:48.840 に答える