我正在使用 EcmaScript 2015 的一些功能,我必须说规范很难理解。
我完全理解这段代码应该抛出某种错误:
(function(a = b, b = 1) { })();
而且我知道默认值可以使用外部作用域:
(function() {
let c = 1;
return (function(a = c) { return a === 1; })();
})();
但我不明白为什么这些例子不好:
(function() {
let a = 1;
(function(a = a) { })();
})();
(function() {
let b = 1;
(function(a = b, b = 2) { })();
})();
我的 Chrome 59.0.3071.115 抛出未定义变量的 ReferenceError。
似乎 Chrome 正在做一些优化,其中只创建了 1 个范围,其中所有参数都设置为不可访问,并在分配后一一添加。
这方面的一些证据可能是:
(function(a = () => b, b = 2) { return a() === 2; })();
这对我来说似乎是一个缺失的机会,我想知道规范是否强制在这里只使用 1 个范围,或者这只是 v8 实现细节。
有人可以指出我在规范中的位置可以澄清这一点吗?