如何定义变量后如何不对其进行评估?

时间:2017-01-11 14:00:25

标签: javascript variables if-statement global-variables conditional-statements

我有这个变量赋值:

var a = 2 + 2;

a的值为4.但我不希望它立即评估2 + 2表达式。如何使变量保持为2 + 2而不是更改为4,直到程序到达命令a进行评估的行?

2 + 2不是我真正想要这样做的一个很好的例子,所以这里有一个非常简单的例子,我需要一个变量来评估,直到我想要它: / p>

var a = (c > d); // and stay as an unevaluated condition
function b() {
    var c = 5;
    var d = 3;
    // evaluate B here
    return b;
}

如果a在分配后立即解析,则会出现未定义的变量错误,因为未定义cd。我想延迟对条件的评估,直到我想要使用它(在evaluate B here行)。我该怎么做?

4 个答案:

答案 0 :(得分:23)

  

这个问题只是推迟对条件的评估,直到它被使用

好的。有些人已经在评论中提到了这一点。在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();

答案 1 :(得分:1)

在您的示例中,变量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

答案 2 :(得分:1)

您可以使用Object.defineProperty创建a,但除非函数b在全局范围内设置cd,否则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
}

答案 3 :(得分:1)

我只能想到这一点。 你分配" a"函数" eval_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);