Косвенный eval вызов в строгом режиме

Я понимаю о томeval() работает в нестрогих условиях, однако в случае использованияeval() в строгом режиме меня полностью озадачили. когдаeval() вызывается непосредственно в глобальной области видимости, переменные хранятся внутри новогоeval() объем:

'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined

Однако, если я выполнюкосвенный позвонитьeval() в глобальном масштабе (должно быть то же самое, верно?), он действует так, как будто не в строгом режиме (если вы мне не верите, посмотритеэто JSFiddle):

'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???

Если вы не понимаете, что(0, eval) делает, видишьПочему главная страница Google использует синтаксис (0, obj.func) (args)?.

По крайней мере, в соответствии с моим пониманием того, какeval() должен работать в строгом режиме, он предназначен для (независимо от того,eval() вызывается прямо или косвенно) создайте новую область видимости для переменных, определенных вeval() Позвоните, однако это не похоже на случай здесь. В спецификации сказано следующее:

10.4.2 Ввод кода Eval

Следующие шаги выполняются, когда элемент управления входит в контекст выполнения для eval-кода:

Если нет вызывающего контекста или eval-код не оценивается прямым вызовом (15.1.2.1.1) к функции eval,

а. Инициализируйте контекст выполнения, как если бы он был глобальным контекстом выполнения, используя код eval какC как описано в10.4.1.1.

В противном случае,

а. УстановитьThisBinding к тому же значению, что иThisBinding вызывающего контекста выполнения.
б. УстановитьLexicalEnvironment к тому же значению, что иLexicalEnvironment вызывающего контекста выполнения.
с. УстановитьVariableEnvironment к тому же значению, что иVariableEnvironment вызывающего контекста выполнения.

Если электронный кодстрогий кодекс, тогда

а. ПозволятьstrictVarEnv быть результатом звонкаNewDeclarativeEnvironment прохождениеLexicalEnvironment в качестве аргумента.
б. УстановитьLexicalEnvironment вstrictVarEnv.
с. УстановитьVariableEnvironment вstrictVarEnv.

выполнятьДекларация обязательной декларации как описано в10,5 используя eval код.

Это относится ко всем основным браузерам, включая (но не ограничиваясь ими) Internet Explorer 10, Chrome 30 и Firefox 24 - поскольку все они ведут себя одинаково, я не думаю, что это ошибка. Разве они оба не хотели делать одно и то же, и если нет, то почему?

Примечание:пожалуйста не говори мне не использоватьeval() (да, я знаю "опасности" использованияeval()) - Я просто хочу понять логику, стоящую за этим, что крайне смущает меня.

Ответы на вопрос(1)

Ваш ответ на вопрос