Это работает для меня в sqlite3:
SELECT *, MAX(rev) FROM t1 GROUP BY id
С * вы получаете дублированный столбец rev, но это не большая проблема.
Насколько я вижу,
blockquote>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) с тем же именем. Поэтому теперь я могу кратко ответить на ваши вопросы:
Видимый вне блока?
blockquote>Да, как
var
. Тем не менее, есть вторая привязка, которая видна только внутри блока.Поднято?
blockquote>Да - дважды.
До какой точки?
blockquote>Обе функции (однако инициализированы с помощью
undefined
) и блоком (инициализируются функциональным объектом).«TDZ»?
blockquote>Не в смысле временной мертвой зоны лексически объявленной переменной (
let
/const
/class
), которая выбрасывает ссылку, no. Но до того, как объявление функции встречается при выполнении тела, переменная с функциональной областью -undefined
(особенно перед блоком), и вы также получите исключение, если попытаетесь вызвать его.
Я не знаю, откуда ваше замешательство. Согласно 10.2.1 , очень ясно, что есть или нет «в строгом режиме». В вашем примере внутренний слот foo
s [[Strict]]
будет true
действительно и будет находиться в строгом режиме, но его размещение в блоке не будет. Первое предложение (указанное вами) относится к блоку хостинга, а не к содержащемуся в нем содержимому. Блок в вашем фрагменте не находится в строгом режиме и, следовательно, этот раздел применяется к нему.