假设我有一些函数 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。
简而言之,解释器还不够 "聪明",它认为计算一次就够了。所以它会调用两次函数。
你要找的是一种叫做memoization的东西,它用于优化计算量大的函数的性能,以便在传递相同的参数时被记住。
如果你需要memoization,你可以自己在自己的函数中实现,也可以使用支持memoization的javascript框架。像React就有useMemo钩子。
请看 https:/reactjs.orgdocshooks-reference.html#usememo
通常情况下,你不需要这样做,只需要将函数的结果存储在一个变量中就足够了。
if (f(-) satisfies some other condition)
将会调用同一个函数,而且它可能永远不会进入这个代码块。if
,因为... function
满足外 if
这就是为什么它进入了该块。
创建一个const,并根据该值执行下一步的操作。
const isFunResult = f(-);
// expecting this function gives a boolean
if(isFunResult){
// code goes here
}
else{
// code goes here
}
您也可以使用 switch
语句,如果函数返回多个结果
跑这个看例子。即使条件相同。
function test_me() {
console.log("I got called");
return 99;
}
if (test_me() == 99) console.log("n=99"); // 1st function call
if (test_me() == 99) console.log("n=99"); // 2nd function call
// is different from the following
var n = test_me(); // function called once
if (n == 99) console.log("n=99"); // 1st test
if (n == 99) console.log("n=99"); // 1st test
回答你的问题: 是的,它计算函数 f(-)
两次。
比起口译员的智慧,更多的是。程序员的意图. 如果程序员认为同一个函数第二次返回的值可能会发生变化,那么可以调用两次,即:如果函数使用的是 new Date()
内的函数...
但是,如果程序员知道两次的输出都是一样的(就像你的情况),最好定义一个常量 x = f(-)
并重用它。这样可以提高性能(如果函数很重的话),并提高代码的可维护性。
即使是编译器,编译器也可能没有足够的智能来检测,除非函数是非常简单的代码。但正如 @perellorodrigo 提到的,你可以使用 memoization
但这超出了本回答的范围。
总结一下,如果你调用同一个函数两次,它将被评估两次。