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

Posted

技术标签:

【中文标题】如何在定义变量后不对其进行评估?【英文标题】: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 中定义。 Right 和 Wrong 请不要大幅更改您的帖子。见How much change to the question is too much? 【参考方案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);

【讨论】:

以上是关于如何在定义变量后不对其进行评估?的主要内容,如果未能解决你的问题,请参考以下文章

PHP将字符串编译为字节码而不对其进行评估

如何在变量已经定义后更改其数值? [复制]

C程序定义一指针变量,直接令它赋值为NULL,不对它用malloc申请内存可以么?赋值和申请内存到底有啥区别

js如何在方法内部定义全局变量

如何在触发器中循环所有列名称而不对其进行硬编码

如何将变量传递给评估函数?