لماذا لا يمكنني تعيين قيم لمتغير داخل تعبير دالة مسمى بنفس الاسم؟

StackOverflow https://stackoverflow.com//questions/24021489

سؤال

هذا تعبير دالة مسمى بالاسم test.في الداخل، أقوم بتعيين 123 إلى متغير، اسمه أيضا test.ثم test تم الدخول.تقوم الوظيفة بطباعة جسمها في وحدة التحكم، ولكن لا 123.ما هو سبب هذا السلوك؟

(function test() {
  test = 123;
  console.log( test );
}());

أين يفشل شرحي لتنفيذ الوظيفة؟

  1. بداية تنفيذ الوظيفة: test هو متغير محلي يشير إلى الوظيفة نفسها
  2. متغير محلي test يتم إعادة تعيينه إلى الرقم 123
  3. console.log(test) يظهر الرقم 123.
هل كانت مفيدة؟

المحلول

أعتقد أن هذه القطعة من مواصفات ايكما يشرح هذا السلوك.وهذا يتعلق على وجه التحديد اسم الشيئ التعبيرات الوظيفية

الانتاج

تعبير الدالة :معرف الوظيفة (FormalParameterListopt) { FunctionBody }

يتم تقييمها على النحو التالي:

  1. دع funcEnv يكون نتيجة استدعاء NewDeclarativeEnvironment لتمرير البيئة المعجمية لسياق التنفيذ قيد التشغيل كوسيطة
  2. اجعل envRec هو سجل بيئة funcEnv.
  3. قم باستدعاء الطريقة الملموسة CreateImmutableBinding لـ envRec لتمرير قيمة سلسلة المعرف كوسيطة.
  4. دع الإغلاق يكون نتيجة إنشاء كائن وظيفة جديد كما هو محدد في 13.2 مع المعلمات المحددة بواسطة FormalParameterListopt والجسم المحدد بواسطة FunctionBody.قم بالتمرير إلى funcEnv باعتباره النطاق.قم بتمرير صحيح كعلامة Strict إذا كان FunctionExpression موجودًا في تعليمات برمجية صارمة أو إذا كان FunctionBody الخاص به عبارة عن تعليمات برمجية صارمة.
  5. قم باستدعاء الطريقة المحددة لـ EnitizeImmutableBinding لـ envRec لتمرير قيمة السلسلة الخاصة بالمعرف والإغلاق كوسيطات.
  6. إغلاق العودة.

استخدام CreateImmutableBinding عند إنشاء نطاق تعبير دالة مسمى، يتم إنشاء المعرف (في هذه الحالة test) كمتغير غير قابل للتغيير.ولهذا فإن التنازل عنها لا يغير من قيمتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top