我正在尝试将外部函数中函数的局部变量作为自由变量访问。
这就是我想要实现的目标:
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
作为局部变量。
答案 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)));
}