>我有这个变量赋值:
var a = 2 + 2;
a
的值将为 4。但我不希望它立即评估2 + 2
表达式。如何使变量保持2 + 2
状态,并且在程序到达要评估a
命令的行之前不更改为 4?
2 + 2
并不是我为什么真正想要这样做的一个很好的例子,所以这里有一个非常简单的例子,在这种情况下,我需要变量在我想要它之前不计算:
var b = (c > d); // and stay as an unevaluated condition
function f() {
var c = 5;
var d = 3;
// evaluate B here
return /* b */;
}
如果在分配后立即解析b
,则会出现未定义的变量错误,因为未定义c
和d
。我想延迟对条件的评估,直到我想使用它(在显示 evaluate B here
的行中)。我该怎么做?
这个问题只是关于延迟对条件的评估,直到它被使用。
好。有些人已经在评论中提到了这一点。在 JavaScript 中延迟计算的标准方法是使计算成为一个函数,然后在需要时调用它。易于实施,易于理解,没有惊喜。
在这里,这会延迟条件的评估,直到使用它:
function a(c, d) {
return c > d;
}
function b() {
var c = 5;
var d = 3;
if (a(c, d)) {
alert("a");
return true;
} else {
alert("b");
return false;
}
}
b();
在您的示例中,变量 c 和 d 未在全局范围内定义;
您需要将它们设为全局或将它们作为 b 函数的参数传递。
为了延迟评估,你可以只使用一个中间函数(在下面的代码片段中名为 evaluateA):
var a, c, d;
function evaluateA(){
return c > d;
};
console.log(a); // undefined
function b() {
c = 2;
d = 1;
return evaluateA();
}
console.log(b()); // true
使用 Object.defineProperty
来创建a
,但除非函数b
在全局范围内设置c
和d
,否则a
将无法计算它们。
Object.defineProperty(window, 'a', {
get: function() {
return c > d;
}
})
function b() {
c = 5; // must use global scope or this will fail
d = 3; // must use global scope or this will fail
return a; // true
}
我只能想到这一点。您为函数"eval_a"分配
"a"的结果// nevaluated condition (function)
function eval_a(c,d){
return c > d;
};
// evaluate
a=eval_a(5,3);
alert(a);
// evaluate again
a=eval_a(1,10);
alert(a);