在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
函数nvl(arg1,arg2,…)
这样的函数,它返回第一个非空参数,并对它们进行惰性计算。在常规函数调用中,在执行函数体之前对所有参数进行求值
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; });