إغلاق جافا سكريبت مقابل.محلي
-
21-12-2019 - |
سؤال
لدي ملف Javascript رئيسي مُحاط بإغلاق يتم استدعاؤه على الفور (حتى لا يلوث "العالمي":
(function () {
"use strict";
var closureVariable = [];
...
}());
لقد ارتكبت خطأً بسيطًا في الترميز عند إزالة متغير من رأس الوظيفة بحيث يحتوي الكود الخاص بي على فاصلة بدلاً من الفاصلة المنقوطة:
function fred () {
var i,
closureVariable = [1,2,3,4];
confused();
}
function confused () {
console.log(closureVariable); // Prints '[]'
}
من المؤكد أن الفاصلة المنقوطة المفقودة في السطر "var i" كانت هي المشكلة.ومع ذلك، فإن السلوك الذي اعتقدت أنه يجب أن يحدث هو أن المتغير المحدد محليًا "closureVariable" يجب أن يلقي بظلاله على تعريف النطاق ذي المستوى الأعلى، ويجب أن تكون قيمة المتغير المحدد محليًا متاحة للوظائف الأدنى في سلسلة النطاق ( أي أن الدالة "المربكة" يجب أن تطبع "[1,2,3,4]"؛
ما الذي لا أفهمه بشأن سلاسل نطاق جافا سكريبت هنا؟
المحلول
ماذا كنت تتوقع كما هو معروف تحديد النطاق الديناميكي.هذا هو صالح اللغة تصميم على نطاق واسع تعتبر أقل شأنا اليوم.ليس فقط ما جافا سكريبت لا.مثل العديد من اللغات الشعبية, جافا سكريبت يستخدم المعجمية النطاق.هذا يعني confused
's نطاق لا يعتبر الطفل نطاق fred
's, لأن التعريف ليس داخل تعريف fred
.حقيقة أن fred
المكالمات confused
ليس له أي تأثير.
نصائح أخرى
var i,
closureVariable = [1,2,3,4];
يجعل متغيرين جديدين، متاحين في fred
الوظيفة والوظائف المحددة في هذا النطاق.
تختلف هذه المتغيرات تمامًا عن أي متغير محدد خارج نطاق fred
النطاق، حتى لو كان لهما نفس الاسم.
التظليل، هنا، يعني أن المتغير الخاص بك اسمه "closureVariable"
يمنع أي وصول مباشر إلى المتغير الذي يحمل نفس الاسم في النطاق الخارجي.
عندما تقوم بإعادة تحديد موقع الفوق عن طريق حذف الفاصلة المنقوطة تم إعادة تعريفه إلا في سياق وظيفة فريد.الوظيفة المشوشة موجودة في سياق إغلاقك، لذلك لا يزال يرى الفحنة الأصلية.إذا كان لديك وظيفتك الخلطية المحددة داخل الوظيفة فريد، فسوف يرى المنحدرة الجديدة وطباعة [1،2،3،4]
giveacodicetagpre.أو إذا كنت ترغب في الاتصال الخلط بين خارج فريد ()
giveacodicetagpre.