لماذا لا يمكنني تعيين قيم لمتغير داخل تعبير دالة مسمى بنفس الاسم؟
-
21-12-2019 - |
سؤال
هذا تعبير دالة مسمى بالاسم test
.في الداخل، أقوم بتعيين 123
إلى متغير، اسمه أيضا test
.ثم test
تم الدخول.تقوم الوظيفة بطباعة جسمها في وحدة التحكم، ولكن لا 123
.ما هو سبب هذا السلوك؟
(function test() {
test = 123;
console.log( test );
}());
أين يفشل شرحي لتنفيذ الوظيفة؟
- بداية تنفيذ الوظيفة:
test
هو متغير محلي يشير إلى الوظيفة نفسها - متغير محلي
test
يتم إعادة تعيينه إلى الرقم123
console.log(test)
يظهر الرقم123
.
المحلول
أعتقد أن هذه القطعة من مواصفات ايكما يشرح هذا السلوك.وهذا يتعلق على وجه التحديد اسم الشيئ التعبيرات الوظيفية
الانتاج
تعبير الدالة :معرف الوظيفة (FormalParameterListopt) { FunctionBody }
يتم تقييمها على النحو التالي:
- دع funcEnv يكون نتيجة استدعاء NewDeclarativeEnvironment لتمرير البيئة المعجمية لسياق التنفيذ قيد التشغيل كوسيطة
- اجعل envRec هو سجل بيئة funcEnv.
- قم باستدعاء الطريقة الملموسة CreateImmutableBinding لـ envRec لتمرير قيمة سلسلة المعرف كوسيطة.
- دع الإغلاق يكون نتيجة إنشاء كائن وظيفة جديد كما هو محدد في 13.2 مع المعلمات المحددة بواسطة FormalParameterListopt والجسم المحدد بواسطة FunctionBody.قم بالتمرير إلى funcEnv باعتباره النطاق.قم بتمرير صحيح كعلامة Strict إذا كان FunctionExpression موجودًا في تعليمات برمجية صارمة أو إذا كان FunctionBody الخاص به عبارة عن تعليمات برمجية صارمة.
- قم باستدعاء الطريقة المحددة لـ EnitizeImmutableBinding لـ envRec لتمرير قيمة السلسلة الخاصة بالمعرف والإغلاق كوسيطات.
- إغلاق العودة.
استخدام CreateImmutableBinding
عند إنشاء نطاق تعبير دالة مسمى، يتم إنشاء المعرف (في هذه الحالة test
) كمتغير غير قابل للتغيير.ولهذا فإن التنازل عنها لا يغير من قيمتها.
لا تنتمي إلى StackOverflow