Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中,求值和延迟求值的参数顺序_Javascript - Fatal编程技术网

在javascript中,求值和延迟求值的参数顺序

在javascript中,求值和延迟求值的参数顺序,javascript,Javascript,如果函数(arg1,arg2),我是否正确地认为arg1保证在arg2之前进行评估(例如与经典C不同) 有没有办法让函数中的参数不计算,而是按需计算?例如,if(cond1 | | cond2)在且仅当cond1为false时计算cond2。是否可以编写我们自己的类if函数 例如,我可以编写一个像oracle的nvl(arg1,arg2,…)这样的函数,它返回第一个非空参数,并对它们进行惰性计算。在常规函数调用中,在执行函数体之前对所有参数进行求值 对 是,如果(cond1 | | cond2)

如果
函数(arg1,arg2)
,我是否正确地认为
arg1
保证在
arg2
之前进行评估(例如与经典C不同)

  • 有没有办法让函数中的参数不计算,而是按需计算?例如,
    if(cond1 | | cond2)
    在且仅当
    cond1
    为false时计算
    cond2
    。是否可以编写我们自己的类
    if
    函数

  • 例如,我可以编写一个像oracle的
    nvl(arg1,arg2,…)
    这样的函数,它返回第一个非空参数,并对它们进行惰性计算。在常规函数调用中,在执行函数体之前对所有参数进行求值

  • 是,如果(cond1 | | cond2),则当cond1为false时,将对cond2求值
  • 下面是一个返回第一个truthy参数的函数:

    function firstDefinedArgument(){
        for(var i in arguments){
            if(arguments[i]){
               return arguments[i];
            }
         }
     }
    
    因此,例如,
    firstDefinedArgument(0,null,undefined,“,“hello”,“再见”)
    将返回
    “hello”


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

    在第一个示例中,是的,如果调用函数,将按顺序计算它们

    在第二个示例中,JS不会计算每个参数(就像C一样),例如:

    x++永远不会运行


    您到底想做什么?

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

    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(){
    for(var i=0;i
    nvl
    的调用返回
    7

    所有函数包装器都已创建,但只有前两个的主体在
    nvl
    中进行计算


    这并不完美,但它允许您在第一个函数返回truthy值后防止在任何函数体中执行昂贵的操作。

    很好的示例。。。很好地展示了如何在javascript.right中惰性地计算条件!希望编写一个类似oracle的
    nvl()
    的函数,该函数返回第一个非空参数。就像
    if
    一样,参数需要惰性地计算。这没有意义。
    | |
    操作符完成相同的任务:
    cond1 | | cond2()| | cond3()
    等。它将只在非false.right之前进行计算,但希望编写一个行为正常的函数similarly@cc我做了一个这样的函数。这就是你想要的吗?不。参数在传递之前仍然会被计算。虽然我有一个想法,但OP想要的基本上是不可能的。你是一只生病的小狗,我推荐你。(尽管对于您的示例,nvl()false将返回,因为它不是null。)您是否需要对作用域进行一些调整,以便在相同的作用域中调用函数?这完全没有意义(无意冒犯)。代码
    false | | | 7 | | | true
    具有与我试图指出的相同的功能@cc杨-不,不会的<代码>如果(res)
    不是空检查,那就是错误检查。我知道你的代码按照你说的做了,我想我表达了我的感激之情-我只是想说,原来的oracle nvl()不是这样工作的-这根本不是对你的代码的反映all@cwolves-如果你把“相同”理解为“有点相同”,那么,是的。这是在一个函数中完成的,这正是OP所寻找的。你的例子很好,也很相关,但它不能在函数中完成,因为参数仍将首先计算。OP不知道他在要求什么。他要求使用另一种语言的功能,因为他已经习惯了。如果你想在函数调用中使用这个函数,它只是
    fn(false | | 7 | | true)
    ,但这不是OP想要的,他想要一个像NVL这样的函数,这是你写的,但是这个函数没有用,因为它可以100%被
    false | 7 | true
    替换。在JavaScript中使用OR运算符是正确的方法;复制另一种语言的方式是不可取的。
    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; });