在javascript中,评估的参数顺序和延迟评估

时间:2011-04-08 03:37:20

标签: javascript

  1. 如果function( arg1, arg2 ),我相信arg1保证在arg2之前进行评估(例如,与经典C不同)吗?

  2. 有没有办法让函数中的参数不被评估,而是根据需要进行评估?例如,当且仅当if( cond1 || cond2 )为false时,cond2才会评估cond1。是否可以编写我们自己的if - 类函数?

  3. 例如,我可以写一个像oracle的nvl( arg1, arg2, ... )这样的函数,它返回第一个非null参数,懒惰地评估它们。在常规函数调用中,在执行函数体之前评估所有参数。

3 个答案:

答案 0 :(得分:3)

函数参数在传递给函数之前会被计算,因此您所要求的不是技术上可行的。但是,你可以这样做:

function nvl() {
    for (var i = 0; i < arguments.length; i++) {
        var res = arguments[i]();
        if (res)
            return res;
    }
}

nvl(function() { return false; }, 
    function() { return 7; }, 
    function() { return true; });

nvl的调用会返回7

创建了所有函数包装器,但只在nvl内评估了前两个的主体。

这不是很漂亮,但它可以让你在第一个函数返回真值后阻止在任何函数体内进行昂贵的操作。

答案 1 :(得分:1)

在你的第一个例子中,是的,如果你正在调用一个函数,它们将按顺序进行评估。

在第二个例子中,JS没有评估每个参数(就像C一样),例如:

if(true || x++){

x ++永远不会运行。

你究竟想做什么?

答案 2 :(得分:0)

  1. 是的,对于if(cond1 || cond2),如果cond1为false,将评估cond2。
  2. 这是一个返回第一个truthy参数的函数:

    function firstDefinedArgument(){
        for(var i in arguments){
            if(arguments[i]){
               return arguments[i];
            }
         }
     }
    

    因此,例如,firstDefinedArgument(0, null, undefined, "", "hello", "goodbye")将返回"hello"

    如果要返回第一个非空参数而不是第一个非空参数,则应将if(arguments[i])替换为if(arguments[i] !== null)。在上面的示例中,此函数将返回0