我试图访问一个外部函数的局部变量作为一个自由变量。
这就是我想要达到的目标:
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)));
}