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(-)计算了两次(如果两个条件都满足),你能具体说明吗?