use*_*410 4 javascript ecmascript-6
我做了一个依赖注入模块。它使用了我发现的带有默认参数的 hack。function (x = SomeDependency) {}. SomeDependency 没有定义,但我可以解析它的 toString(对于类构造函数、箭头函数和简洁的对象方法也是如此)。它并不意味着在浏览器中受支持,仅在 Node.js 中受支持。
我的问题:我找不到任何关于参数是否被懒惰评估的文档,是否存在任何规范/文档?或者这只是未定义的行为?
更新:
我正在做的是使用未定义的默认参数(如上例所示),并解析函数/类的 toString 以找出它们是什么,然后调用函数或使用注入的参数更新类。
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。
这是因为foo和bar在参数传递给bof
参数是否被延迟评估?
不,JavaScript 中的所有内容都会被急切地求值(如果你原谅逻辑操作数的短路求值的话)。
具体来说,使用参数时不会评估参数的默认初始化程序,而是在调用函数时立即评估它们。然而,它们是有条件地评估的 - 每当参数是 时undefined,就像子句中的语句一样if。
是否存在这方面的任何规范/文档?
是的,JavaScript 评估顺序在 ECMAScript 标准中指定(当前修订版: http: //www.ecma-international.org/ecma-262/7.0/)。几乎没有任何未定义的行为。
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |