ما هو "استدعاء السياق؟"
-
23-12-2019 - |
سؤال
ECMA-262 5.1 الأقسام الفرعية 10.4.2 و 10.4.2.1 تشير إلى "استدعاء السياق." هذا لا يبدو أن يكون هو موضح في أي مكان آخر في المستند.
نقلا عن المواصفات ، التشديد من الألغام:
10.4.2 دخول Eval رمز
الخطوات التالية يتم تنفيذها عند السيطرة يدخل في سياق التنفيذ عن التقييم كود:
- إذا كان هناك أي استدعاء السياق أو إذا كان eval رمز لم يتم تقييمها من قبل دعوة مباشرة (15.1.2.1.1) إلى الدالة eval ثم ،
10.4.2.1 صارمة وضع قيود
التقييم رمز لا مثيل متغير أو دالة الارتباطات في متغير البيئة استدعاء السياق استندت إلى eval إذا كان أي رمز استدعاء السياق أو eval قانون صارم رمز.بدلا من هذه الارتباطات يتم إنشاء مثيل جديد VariableEnvironment التي لا يمكن الوصول إليها إلا eval رمز.
ما معنى "الدعوة السياق" يعني في هذه الفقرات ؟ أظن أن ذلك يشير إلى سياق التنفيذ في الجزء العلوي من المكدس قبل
eval
يطلق عليه ، يمكن لأي شخص التحقق من هذا ؟ماذا يعني أن يكون "لا يدعو السياق؟" يمكن للشخص تقديم مثال من التعليمات البرمجية أو الظروف التي يمكن أن تؤدي إلى الدعوة إلى
eval
مع عدم استدعاء السياق ؟
المحلول
إن "استدعاء السياق" يشير إلى السياق الأصلي eval
وظيفة مطلوب من.
إذا كنت تنفيذ eval
من بعض التعليمات البرمجية الأصلية (على سبيل المثال ، يمكنك تشغيل وظيفة الأم التي ينفذ التعليمات البرمجية عند الانتهاء من استخدام eval
لسبب أو آخر) ، ثم سيكون لديك أي سياق ، والتي يتم بعد ذلك تحديد تعمل تحت نطاق عالمي.سياق يشير فقط إلى ECMAScript التعليمات البرمجية القابلة للتنفيذ.
ومع ذلك ، فإن استدعاء السياق يشير إلى متغيرات والتوجيهات في سياق التنفيذ من حيث يطلق عليه.على سبيل المثال, فإنه يعلم أن التقييم يهدف إلى العمل الصارم رمز إذا كان يتحقق استدعاء السياق.
هذا هو توضيح جدا مثل هذا السؤال في ES-مناقشة القائمة البريدية, حيث برندان إيتش (خالق جافا سكريبت) يستجيب:
كيف يمكن أن eval رمز لا يكون داعيا السياق ؟
ES3 يقول:
10.2.2 Eval رمز
عندما يدخل إعدام السياق eval الكود السابق النشط سياق التنفيذ ، ويشار إلى أن استدعاء السياق, يستخدم لتحديد نطاق سلسلة متغير الكائن و هذه القيمة.إذا كان هناك أي استدعاء السياق ، ثم initialising سلسلة نطاق متغير مثيل ، تحديد هذه القيمة يتم تنفيذ مثل المدونة العالمية.
أنا في حيرة "إذا لم يكن هناك استدعاء السياق".كيف يمكن إمكانية تنشأ ؟ كيف
eval
يطلق على إن لا أحد يدعو ذلك ؟
الرد:
مكالمة من التعليمات البرمجية الأصلية ، "المضيف" البرنامج.
بعض المتصفحات الدعم غير المباشرة
eval
, يسمح هذا:setTimeout(eval, 0, "alert('hi mom')");
النافذة المستخدمة في
setTimeout
تم العثور على طول سلسلة نطاق ، حتىmyFrame.setTimeout(eval, 0, "alert(x)");
يجب أن تظهر
myFrame.x
, وليس الدعوة إطار أو نافذةx
.
ملاحظة: myFrame
في هذا المثال يشير إلى الإطار العالمي نطاق.