Косвенный 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()
звоните, однако это неКажется, дело здесь. В спецификации сказано следующее:
Следующие шаги выполняются, когда элемент управления входит в контекст выполнения для 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()
) - Я просто хочу понять логику, стоящую за этим, что крайне смущает меня.