【发布时间】:2017-12-07 09:17:16
【问题描述】:
我正在使用 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 that variable is not defined。
Chrome 似乎在做一些优化,只创建了 1 个作用域,所有参数都设置为不可访问,并在分配后一一添加。
这方面的一些证据可能是:
(function(a = () => b, b = 2) { return a() === 2; })();
对于我的口味来说,这似乎是一个错失的机会,我想知道规范是否强制在这里只使用 1 个作用域,或者这只是 v8 实现细节。
有人可以指点我放在可以澄清这一点的规范中吗?
【问题讨论】:
-
missing opportunity for my taste- 这是其他人编写的语言的问题:p -
参数范围是它自己的范围。在函数声明表达式中,定义为参数的符号立即占主导地位。所以
(a = a)没有意义,因为左侧的a在包含上下文中隐藏了a。