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_r. 制作i一个全局变量是可行的,但我需要i成为一个局部变量。

4

5 回答 5

2

使用var i,该变量只能在定义它的函数范围内访问。同一范围内的匿名函数确实可以访问它,但对外部定义的函数的调用没有访问权限。相反,您需要传递变量或在两个上下文都可用的范围内定义它(例如,全局范围,但我不建议您使用它)。

我也会对您具体尝试做的事情非常谨慎。如果你必须使用eval来做某事,那可能是错误的事情。

于 2013-03-12T02:23:56.020 回答
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);
    }       
}`

你为什么要评估?我认为你可以用上面的代码实现你想要做的事情。

于 2013-03-12T02:28:20.807 回答
1

这似乎是 JavaScript 中动态作用域的有用之处。请参阅此 StackOverflow 线程:是否可以在不借助 eval 的情况下在 JavaScript 中实现动态范围?

这就是我要做的:

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 回答
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 回答
0

您应该将其添加到字符串中,但就像这样。将其作为参数传递并将其集成到表达式中。

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

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

或者您可以尝试在表达式中替换它以允许 && 表达式与多个 i

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

function show_r(i,expression) {
    if (eval(expression.replace("i",i)) {
        i++;
        show_r(expression.replace("i",i));
    } else alert(eval(expression.replace("i",i)));
 }
于 2014-12-21T23:00:53.707 回答