Javascript 双函数调用还是将结果存储为变量?

Javascript 双函数调用还是将结果存储为变量?,javascript,performance,variables,Javascript,Performance,Variables,假设我在别处定义了一些函数f(-)。我在以下类型的代码中使用了两次: if (f(-) satisfies some condition) { do some stuff if (f(-) satisfies some other condition) { do some other stuff } } 当代码运行时,f(-)是否计算了两次(或者解释器是否“智能”到足以看到只计算一次)?如果是这样,是否建议在该代码之前定义一个常数x=f(-),并使用该常

假设我在别处定义了一些函数
f(-)
。我在以下类型的代码中使用了两次:

if (f(-) satisfies some condition) {
    do some stuff
    if (f(-) satisfies some other condition) {
        do some other stuff
    }
}
当代码运行时,
f(-)
是否计算了两次(或者解释器是否“智能”到足以看到只计算一次)?如果是这样,是否建议在该代码之前定义一个常数
x=f(-)
,并使用该常数代替
f(-)
?通常我会这样做,但我不能完全确定是否有必要这样做,特别是当
f(-)
的计算速度非常快时

如果有关系,语言是JavaScript。

如果(f(-)满足某些其他条件)
将调用相同的函数,它可能永远不会进入紧跟着这个
的块,因为
函数满足外部
如果
这就是它进入该块的原因

创建一个常量,并根据该值执行下一步

const isFunResult = f(-);
// expecting this function gives a boolean
   

if(isFunResult){
     // code goes here
    }
   else{
    // code goes here
   }

如果函数返回多个结果,也可以使用
switch
语句。

运行此命令查看示例。即使条件相同

功能测试_me(){
log(“我接到电话”);
返回99;
}
if(test_me()==99)console.log(“n=99”);//第一次函数调用
if(test_me()==99)console.log(“n=99”);//第二次函数调用
//与以下内容不同
var n=test_me();//函数调用一次
如果(n==99)console.log(“n=99”);//第一次测试

如果(n==99)console.log(“n=99”);//第一次测试
简言之,解释器不够“智能”,无法看到它足以计算一次。因此,它将调用函数两次

您正在寻找的是一种称为memonization的东西,它用于优化在传递相同参数时要记住的计算量大的函数的性能

如果您需要备忘录,您可以自己在自己的函数中实现,也可以使用支持该功能的javascript框架。就像React有UseMoom钩子一样

通常情况下,您不需要这样做,对于大多数用例来说,仅将函数结果存储在变量中就足够了。

回答您的问题:是的,它会计算函数
f(-)
两次

这不仅仅是解释器的智能,更是程序员的意图。如果程序员认为同一函数可能会在第二次返回更改的值,则可以调用该函数两次。i、 e:如果函数在函数中使用
新日期()

但是,如果程序员知道两次输出都是相同的(就像您的情况一样),那么最好定义一个常量
x=f(-)
,然后重用它。这将提高性能(如果函数很重),并提高代码的可维护性

即使它是一个编译器,除非函数是一个非常简单的代码,否则编译器可能没有足够的智能来检测它。但正如@perellorodrigo所提到的,您可以使用
记忆化
,但这超出了本答案的范围


总而言之,如果调用同一个函数两次,它将被计算两次

在您的示例中,该函数应该被调用两次,除非您在代码之外调用并分配该函数的结果,然后使用IF进行多次测试。如果您知道该函数将两次返回相同的值,则应将其移动到常量。如果没有,将进行两次评估。我提供了一个描述作为回答,以帮助其他读者。好的,谢谢。如果f(-)计算了两次(如果两个条件都满足),你能具体说明吗?