Javascript 局部变量到外部函数

Javascript 局部变量到外部函数,javascript,eval,scope,dynamic-scope,Javascript,Eval,Scope,Dynamic Scope,我试图访问外部函数中函数的局部变量作为自由变量 这就是我想要实现的目标: 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)); } 我得到一个

我试图访问外部函数中函数的局部变量作为自由变量

这就是我想要实现的目标:

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设为局部变量。

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

我也会对你具体想做的事非常谨慎。如果必须使用eval来执行某些操作,那么这可能是错误的。

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

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来做一些事情,那可能是错误的

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);
    }       
}`
你为什么要做评估?我认为您可以用上面的代码实现您想要做的事情

你为什么要做评估?我认为您可以使用上述代码实现您的目标。

这将更好地工作:

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)));
    }       
}
这将更好地发挥作用:

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)));
    }       
}

这似乎是JavaScript中的动态作用域非常有用的事情。请参阅此StackOverflow线程:

这就是我要做的:

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

您可以在这里看到演示:

这似乎是JavaScript中的动态作用域非常有用的东西。请参阅此StackOverflow线程:

这就是我要做的:

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

您可以在这里看到演示:

您应该添加字符串,但如下所示。将其作为参数传递,并将其集成到表达式中

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进行&&expresions

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)));
 }

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

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进行&&expresions

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)));
 }

我试着模仿while语句,然后消费者可以做一些类似的事情:show_r'I>9'或show_r'I!=3'之类的,这是因为我需要评估。谢谢你的回答!因此,在真正的函数意义上,你可以编写一个函数,它包含两个参数,x,y和操作符,并在那里进行计算。我尝试模拟一个while语句,然后,消费者可以执行如下操作:show_r'I>9'或show_r'I!=3'之类的,这是因为我需要评估。谢谢你的回答!所以在真正的函数意义上,你可以编写一个函数,它包含两个参数,x,y和操作符,然后在那里进行计算。嗨,这对我的情况不起作用,因为要计算的表达式可能会改变,我说,我试着模拟while语句,然后消费者可以做一些事情:如果你想让计算是动态的,那么显示a,使用上面显示的伪字符,然后在show_r函数中替换它。通过这种方式,你也可以传递'true'或'false'。嗨,这对我的情况不起作用,因为要评估的表达式可能会改变,我是如何说的,我尝试模拟while语句,然后消费者可以做一些事情:如果你希望评估是动态的,那么显示a,使用上面显示的伪字符,然后在show_r函数中替换它。通过这种方式,您也可以传入'true'或'false'。您好,我尝试模拟while语句,然后表达式可以更改,因为我需要eval来计算它们。谢谢你的回答!您好,我尝试模拟while语句,然后表达式可以更改,因为我需要eval来计算它们。谢谢你的回答!