Неисправность функционального блока ES6 не работает по назначению? [Дубликат]

Это работает для меня в sqlite3:

SELECT *, MAX(rev) FROM t1 GROUP BY id

С * вы получаете дублированный столбец rev, но это не большая проблема.

16
задан rvidal 15 July 2015 в 01:15
поделиться

2 ответа

Насколько я вижу, strict ссылается на внутренний слот [[Strict]] объекта функции.

No. И да. Это относится к строгости функции ( или script ) , в которой происходит блок, содержащий объявление функции. Не строгость функции, которая (или не) должна быть объявлена.

«Веб-расширения» применяются только к неаккуратным (нестрогим) кодам и только если внешний вид функции оператор является «нормальным», то есть, например, если его имя не сталкивается с формальным параметром или лексически объявленной переменной.

Обратите внимание, что нет никакой разницы между строгим и неаккуратным кодом без веб- семантика совместимости. В чистом ES6 существует только одно поведение для объявлений функций в блоках.

Итак, у нас в основном есть

                 |      web-compat               pure
-----------------+---------------------------------------------
strict mode ES6  |  block hoisting            block hoisting
sloppy mode ES6  |  it's complicated ¹        block hoisting
strict mode ES5  |  undefined behavior ²      SyntaxError
sloppy mode ES5  |  undefined behavior ³      SyntaxError

1: См. Ниже. Прошу прощения. 2: Как правило, бросается SyntaxError 3: примечание в ES5.1 §12 говорит о « значительных и непримиримых вариациях среди реализаций » (таких как эти [/ д2]). Предупреждения рекомендуются.

Итак, как теперь реализуется реализация ES6 с совместимостью в Интернете для объявления функции в блоке в режиме sloppy-mode с унаследованной семантикой? Прежде всего, чистая семантика все еще применяется. То есть объявление функции поднимается вверху лексического блока. Тем не менее, есть также объявление var, которое поднимается в верхней части закрывающей функции. И когда объявление функции оценивается (в блоке, как если бы оно выполнялось как оператор), объекту функции присваивается эта переменная с ограниченной функциональностью.

Это лучше объясняется кодом:

function enclosing(…) {
    …
    {
         …
         function compat(…) { … }
         …
    }
    …
}

работает так же, как

function enclosing(…) {
    var compat₀ = undefined; // function-scoped
    …
    {
         let compat₁ = function compat(…) { … }; // block-scoped
         …
         compat₀ = compat₁;
         …
    }
    …
}

Да, это немного сбивает с толку, имея два разных привязки (обозначенные нижними индексами 0 и 1) с тем же именем. Поэтому теперь я могу кратко ответить на ваши вопросы:

Видимый вне блока?

Да, как var. Тем не менее, есть вторая привязка, которая видна только внутри блока.

Поднято?

Да - дважды.

До какой точки?

Обе функции (однако инициализированы с помощью undefined) и блоком (инициализируются функциональным объектом).

«TDZ»?

Не в смысле временной мертвой зоны лексически объявленной переменной (let / const / class), которая выбрасывает ссылку, no. Но до того, как объявление функции встречается при выполнении тела, переменная с функциональной областью - undefined (особенно перед блоком), и вы также получите исключение, если попытаетесь вызвать его.

20
ответ дан Bergi 27 August 2018 в 00:04
поделиться

Я не знаю, откуда ваше замешательство. Согласно 10.2.1 , очень ясно, что есть или нет «в строгом режиме». В вашем примере внутренний слот foo s [[Strict]] будет true действительно и будет находиться в строгом режиме, но его размещение в блоке не будет. Первое предложение (указанное вами) относится к блоку хостинга, а не к содержащемуся в нем содержимому. Блок в вашем фрагменте не находится в строгом режиме и, следовательно, этот раздел применяется к нему.

1
ответ дан Amit 27 August 2018 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: