Я играю с некоторыми функциями 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 throws ReferenceError, эта переменная не определена.
Кажется, что Chrome делает некоторую оптимизацию, где создается только одна область, где все параметры установлены как недоступные, и они добавляются один за другим после их назначения.
Некоторое доказательство этого может быть:
(function(a = () => b, b = 2) { return a() === 2; })();
Это выглядит как недостающая возможность для моего вкуса, и мне интересно, добавляет ли спецификационная сила только 1 область здесь или это только детали реализации v8.
Может кто-нибудь, пожалуйста, укажите мне, чтобы указать в спецификации, которая могла бы прояснить это?