局部变量到外部函数

时间:2013-03-12 02:19:34

标签: 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));
}

我收到错误,因为变量i未在show_r的范围内定义。使i成为一个全局变量,但我需要i作为局部变量。

5 个答案:

答案 0 :(得分:2)

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

我也非常警惕你要特意做的事情。如果 使用eval做某事,那可能是错误的。

答案 1 :(得分: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?我认为你可以用上面的代码实现你想要做的事情。

答案 2 :(得分: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/

答案 3 :(得分: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)));
    }       
}

答案 4 :(得分: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));
 }

或者您可以尝试在表达式中替换它以允许&amp;&amp;多个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)));
 }