外部函数的局部变量



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

这就是我想要达到的目标:

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做某事,这可能是错误的。

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?我认为你可以实现你想做上面的代码。

这似乎是JavaScript中动态作用域的有用之处。看看这个StackOverflow线程:有没有可能在JavaScript中实现动态作用域而不诉诸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/

这样会更好:

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

最新更新