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

use*_*410 4 javascript ecmascript-6

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

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

更新:

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

Tha*_*you 6

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

不。JavaScript 使用应用顺序评估

这也很容易测试

var foo = ()=> (console.log('foo'), 'foo');
var bar = ()=> (console.log('bar'), 'bar');
var bof = (a,b)=> console.log('bof',a,b);

bof(foo(), bar());
Run Code Online (Sandbox Code Playgroud)

请注意,您将在评估之前看到"foo""bar"出现在日志中bof

这是因为foobar在参数传递给bof

  • @AurelBílý 我首先给出了简短的答案,然后在重新阅读之后决定扩展一些要点以澄清一些问题。 (2认同)

Ber*_*rgi 5

参数是否被延迟评估?

不,JavaScript 中的所有内容都会被急切地求值(如果你原谅逻辑操作数的短路求值的话)。

具体来说,使用参数时不会评估参数的默认初始化程序,而是在调用函数时立即评估它们。然而,它们是有条件地评估的 - 每当参数是 时undefined,就像子句中的语句一样if

是否存在这方面的任何规范/文档?

是的,JavaScript 评估顺序在 ECMAScript 标准中指定(当前修订版: http: //www.ecma-international.org/ecma-262/7.0/)。几乎没有任何未定义的行为