javascript参数是否被延迟计算?

javascript参数是否被延迟计算?,javascript,ecmascript-6,Javascript,Ecmascript 6,我制作了一个依赖注入模块。它使用了我发现的带有默认参数的黑客函数(x=SomeDependency){}。SomeDependency没有定义,但我可以解析它的toString(类构造函数、箭头函数和简洁的对象方法也是如此)。浏览器不支持它,只支持节点 我的问题:我找不到任何关于参数是否被延迟计算的文档,是否存在任何关于此的规范/文档?或者这仅仅是未定义的行为 更新: 我所做的是使用未定义的默认参数(如上面的示例所示),解析函数/类的toString以找出它们是什么,然后调用函数或使用注入的参数

我制作了一个依赖注入模块。它使用了我发现的带有默认参数的黑客<代码>函数(x=SomeDependency){}。SomeDependency没有定义,但我可以解析它的toString(类构造函数、箭头函数和简洁的对象方法也是如此)。浏览器不支持它,只支持节点

我的问题:我找不到任何关于参数是否被延迟计算的文档,是否存在任何关于此的规范/文档?或者这仅仅是未定义的行为

更新:

我所做的是使用未定义的默认参数(如上面的示例所示),解析函数/类的toString以找出它们是什么,然后调用函数或使用注入的参数更新类

javascript参数是否被延迟计算

否。JavaScript使用评估

这也很容易测试

var foo=()=>(console.log('foo'),'foo');
var bar=()=>(console.log('bar'),'bar');
var bof=(a,b)=>console.log('bof',a,b);
转炉(foo(),bar())
参数是否被惰性地评估

不,JavaScript中的所有内容都是经过严格评估的(如果您不介意对逻辑操作数进行短路评估的话)

具体来说,参数的默认初始值设定项在使用参数时不会计算,而是在调用函数时急切地计算。然而,它们是有条件地进行计算的——只要参数
未定义
,就很像
if
子句中的语句

是否有关于这方面的任何规范/文件


是的,JavaScript评估顺序在ECMAScript标准(当前版本:)中指定。有。

你说的“评估”是什么意思?至于放在参数中的实际表达式,它们必须在调用函数之前进行完整的计算,如@naomik所示。尽管您可能想知道JS引擎本身的延迟计算,但在函数中使用参数和不使用参数之间是否有区别?现在我是,我无法回答这个问题。“手动解析函数/类的toString…”(娜奥米克:你们还有其他选择吗?:P我洗耳恭听。我完全同意:(!它们不是默认参数,它们是参数的默认初始值设定项,它们不是惰性地进行计算,而是有条件地进行计算-每当参数
未定义时
@Bergi Sweet,我知道我的术语有点不正确。但在这种情况下,这应该可以正常工作。如果你用它来回答,我会将它标记为我的问题。我看着你越来越多地编辑你的答案,一个有趣的节目@AurelBílýI首先给出了简短的答案,在重新阅读后,它决定扩展一些要点来澄清一些问题。只是好奇:
console.log
的打印顺序是否保证与它的调用顺序相同?不管怎样,堆栈片段可能也是如此……如果您担心控制台是否是jum的话在显示之前,您可以使用其他方法收集这些值。谢谢您的回答!我可能应该阅读更多的SICP:P