Вопрос

ECMA-262 5.1 подразделы 10.4.2 и 10.4.2.1 См. «Контекст вызова». Это, кажется, не описано нигде в документе.

Цитируя спецификацию, акцент мой:

10.4.2 Ввод кода проверки

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

  1. Если нет контекст вызова или если код оценки не оценивается прямым вызовом (15.1.2.1.1) функции оценки, тогда:

10.4.2.1 Ограничения строгого режима

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

  • Что означает «контекст вызова» в этих абзацах?Я бы предположил, что это относится к Контекст выполнения наверху стопки незадолго до этого eval называется;может ли кто-нибудь это проверить?

  • Что значит, что "нет контекста призвания?" Может ли кто -нибудь дать пример кода или условий, которые могут привести к вызову eval без контекста вызова?

Это было полезно?

Решение

«Контекст вызова» относится к контексту, который родной eval функция вызывается из.

Если вы выполняете eval из некоторого собственного кода (например, вы запускаете встроенную функцию, которая выполняет код после завершения с использованием eval по той или иной причине), то у него не будет контекста, который затем указывается для запуска в глобальной области видимости.Контекст относится только к исполняемому коду ECMAScript.

Однако контекст вызова относится к переменным и директивам в контексте выполнения того места, где он вызывается.Например, он знает, что eval должен работать как строгий код, только если проверяет контекст вызова.

Это поясняется очень похожим вопросом в списке рассылки ES-Discuss, где Брендан Эйх (создатель JavaScript) отвечает:

Как код eval может не иметь контекста вызова?

ES3 говорит:

10.2.2 Код оценки

Когда элемент управления входит в контекст выполнения для кода Eval, предыдущий контекст активного выполнения, называемый вызывающим контекст, используется для определения цепочки объема, объекта переменной и этого значения.Если нет вызового контекста, то инициализация цепочки объема, переменная экземпляра и определение этого значения выполняются так же, как для глобального кода.

Меня сбивает с толку «Если нет контекста вызова».Как может возникнуть возможность?Как бы eval позвонят, если никто не позвонит?

Ответ:

Вызов из собственного кода, «хостовой» программы.

Некоторые браузеры поддерживают косвенную eval, что позволяет:

setTimeout(eval, 0, "alert('hi mom')");

Используется окно, в котором setTimeout был найден вдоль цепочки областей, поэтому

myFrame.setTimeout(eval, 0, "alert(x)");

должен показать myFrame.x, а не вызывающий фрейм или окно x.

Примечание: myFrame в данном случае относится к глобальной области действия фрейма.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top