是否懒惰地评估了javascript参数?

时间:2016-06-17 19:16:50

标签: javascript ecmascript-6

我制作了一个依赖注入模块。它使用我用默认参数发现的hack。 function (x = SomeDependency) {}。 SomeDependency没有定义,但是我可以解析它的toString(对于类构造函数,箭头函数和简洁对象方法也是如此)。它并不意味着在浏览器中支持,只在Node中支持。

我的问题:我找不到关于参数是否被懒惰评估的任何文档,是否存在任何关于此的规范/文档?或者这只是未定义的行为?

更新

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

2 个答案:

答案 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

这是因为foobar在参数传递给bof之前首先被评估

答案 1 :(得分:1)

  

是否懒惰地评估了参数?

不,急切地评估JavaScript中的所有内容(如果您原谅逻辑操作数的短路评估)。

具体而言,在使用参数时不会评估参数的默认初始化程序,在调用函数时会急切地评估它们。然而,有条件地评估它们 - 只要参数为undefined,就像if子句中的语句一样。

  

是否存在关于此的任何规范/文档?

是的,JavaScript评估顺序在ECMAScript标准中指定(当前版本:http://www.ecma-international.org/ecma-262/7.0/)。有hardly any undefined behaviour