我制作了一个依赖注入模块。它使用我用默认参数发现的hack。 function (x = SomeDependency) {}
。 SomeDependency没有定义,但是我可以解析它的toString(对于类构造函数,箭头函数和简洁对象方法也是如此)。它并不意味着在浏览器中支持,只在Node中支持。
我的问题:我找不到关于参数是否被懒惰评估的任何文档,是否存在任何关于此的规范/文档?或者这只是未定义的行为?
更新
我正在做的是使用未定义的默认参数(如上例所示),并解析函数/类的toString以找出它们是什么,然后调用函数或用注入的参数新建类。 / p>
答案 0 :(得分:4)
懒惰评估javascript参数吗?
否。 JavaScript使用applicative order评估
这也非常容易测试
var foo = ()=> (console.log('foo'), 'foo');
var bar = ()=> (console.log('bar'), 'bar');
var bof = (a,b)=> console.log('bof',a,b);
bof(foo(), bar());
请注意,在评估"foo"
之前,您会在日志中看到"bar"
和bof
。
这是因为foo
和bar
在参数传递给bof
之前首先被评估
答案 1 :(得分:1)
是否懒惰地评估了参数?
不,急切地评估JavaScript中的所有内容(如果您原谅逻辑操作数的短路评估)。
具体而言,在使用参数时不会评估参数的默认初始化程序,在调用函数时会急切地评估它们。然而,有条件地评估它们 - 只要参数为undefined
,就像if
子句中的语句一样。
是否存在关于此的任何规范/文档?
是的,JavaScript评估顺序在ECMAScript标准中指定(当前版本:http://www.ecma-international.org/ecma-262/7.0/)。有hardly any undefined behaviour。