Косвенный 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)

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