【问题标题】:How to not evaluate a variable as soon as it's defined?如何在定义变量后不对其进行评估?
【发布时间】:2017-05-26 08:43:33
【问题描述】:

我有这个变量赋值:

var a = 2 + 2;

a 的值将是 4。但我不希望它立即计算 2 + 2 表达式。如何使变量保持为 2 + 2 并且在程序到达我命令 a 进行评估的行之前不更改为 4?

2 + 2 不是一个很好的例子来说明我为什么要这样做,所以这里有一个非常简单的例子,说明我需要一个变量在我想要它之前不计算:

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 行)。我该怎么做?

【问题讨论】:

  • a 应该是一个函数,而不是一个变量,如果你想延迟评估
  • function a() = { return c > d; };,然后是if (a()) ... 虽然如果 a 没有在其他任何地方使用,为什么还要在函数之外进行赋值...?
  • 你需要全局变量a吗?顺便说一句,cd 没有在 a 的范围内声明。
  • 它不会运行,因为c & d 未在您的全局a 中定义。 RightWrong
  • 请不要大幅更改您的帖子。见How much change to the question is too much?

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


【解决方案1】:

这个问题只是关于延迟条件的评估直到它被使用

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

【讨论】:

    【解决方案2】:

    在您的示例中,变量 c 和 d 未在全局范围内定义;

    您需要将它们设为全局或将它们作为 b 函数的参数传递。

    为了延迟评估,您可以只使用一个中间函数(在下面的代码 sn-p 中命名为 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

    【讨论】:

      【解决方案3】:

      您可以使用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
      }

      【讨论】:

        【解决方案4】:

        我只能想到这个。 您将函数“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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-15
          • 2019-04-15
          • 1970-01-01
          • 1970-01-01
          • 2016-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多