Что такое «контекст вызова»?
-
23-12-2019 - |
Вопрос
ECMA-262 5.1 подразделы 10.4.2 и 10.4.2.1 См. «Контекст вызова». Это, кажется, не описано нигде в документе.
Цитируя спецификацию, акцент мой:
10.4.2 Ввод кода проверки
Следующие шаги выполняются, когда элемент управления входит в контекст выполнения кода оценки:
- Если нет контекст вызова или если код оценки не оценивается прямым вызовом (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
в данном случае относится к глобальной области действия фрейма.