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

问题描述 投票:2回答:4

假设我有一些函数 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。

javascript performance variables
4个回答
1
投票

简而言之,解释器还不够 "聪明",它认为计算一次就够了。所以它会调用两次函数。

你要找的是一种叫做memoization的东西,它用于优化计算量大的函数的性能,以便在传递相同的参数时被记住。

如果你需要memoization,你可以自己在自己的函数中实现,也可以使用支持memoization的javascript框架。像React就有useMemo钩子。

请看 https:/reactjs.orgdocshooks-reference.html#usememo

通常情况下,你不需要这样做,只需要将函数的结果存储在一个变量中就足够了。


1
投票

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 语句,如果函数返回多个结果


1
投票

跑这个看例子。即使条件相同。

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

1
投票

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

比起口译员的智慧,更多的是。程序员的意图. 如果程序员认为同一个函数第二次返回的值可能会发生变化,那么可以调用两次,即:如果函数使用的是 new Date() 内的函数...

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

即使是编译器,编译器也可能没有足够的智能来检测,除非函数是非常简单的代码。但正如 @perellorodrigo 提到的,你可以使用 memoization但这超出了本回答的范围。

总结一下,如果你调用同一个函数两次,它将被评估两次。

© www.soinside.com 2019 - 2024. All rights reserved.