دعونا نلقي نظرة على الغرض من الإغلاق. في الواقع ، باستخدام عمليات الإغلاق ، يمكننا القيام بالكثير من الأشياء. على سبيل المثال ، محاكاة نمط الكود الموجهة للكائنات ؛ الكود التعبير أكثر أناقة وإيجازًا ؛ وتحسين كفاءة تنفيذ الكود في بعض الجوانب.
1 وظيفة التنفيذ الذاتية المجهولة
نحن نعلم أنه إذا لم تتم إضافة جميع المتغيرات مع الكلمة الرئيسية VAR ، فسيتم إضافة الافتراضي إلى خصائص الكائن العالمي. هناك العديد من العيوب لإضافة مثل هذه المتغيرات المؤقتة إلى الكائن العالمي.
على سبيل المثال: قد تسيء الوظائف الأخرى استخدام هذه المتغيرات ؛ إن التسبب في أن يكون الكائن العالمي كبيرًا جدًا ويؤثر على سرعة الوصول (لأن قيمة المتغير يجب اجتيازها من سلسلة النموذج الأولي).
بالإضافة إلى استخدام الكلمة الرئيسية VAR في كل مرة نستخدم فيها المتغير ، فإننا نواجه غالبًا موقفًا لا يلزم تنفيذ بعض الوظائف إلا مرة واحدة ولا يلزم الحفاظ على متغيراتها الداخلية.
على سبيل المثال ، في تهيئة واجهة المستخدم ، يمكننا استخدام عمليات الإغلاق:
نسخة الكود كما يلي:
var datamodel = {
طاولة : []،
شجرة: {}
} ؛
(وظيفة (DM) {
لـ (var i = 0 ؛ i <dm.table.rows ؛ i ++) {
var row = dm.table.rows [i] ؛
لـ (var j = 0 ؛ j <row.cells ؛ i ++) {
DrawCell (i ، j) ؛
}
}
// بناء dm.tree
}) (datamodel) ؛
نقوم بإنشاء وظيفة مجهولة وننفذها على الفور ، لأن الخارجي لا يمكن أن يشير إلى المتغيرات بداخلها ،
لذلك ، سيتم إصداره بعد التنفيذ بفترة وجيزة. المفتاح هو أن هذه الآلية لن تلوث الكائن العالمي.
2 ذاكرة التخزين المؤقت
لنأخذ مثالًا آخر. تخيل أن لدينا كائن وظيفة يستغرق وقتًا طويلاً يستغرق وقتًا طويلاً لمعالجة كل مكالمة.
ثم نحتاج إلى تخزين القيمة المحسوبة. عند استدعاء هذه الوظيفة ، نبحث أولاً في ذاكرة التخزين المؤقت. إذا كان لا يمكن العثور عليه ، فسنقوم بإجراء الحساب.
ثم قم بتحديث ذاكرة التخزين المؤقت وإرجاع القيمة. إذا تم العثور عليه ، ما عليك سوى إرجاع القيمة التي تم العثور عليها مباشرة. إن الإغلاق يفعل هذا بالضبط ، لأنه لا يطلق مراجع خارجية ،
وبالتالي يمكن الحفاظ على القيمة داخل الوظيفة.
نسخة الكود كما يلي:
var cachedsearchbox = (function () {
var cache = {} ،
العد = [] ؛
يعود {
AccessSearchBox: Function (dsid) {
إذا (dsid في ذاكرة التخزين المؤقت) {// إذا كانت النتيجة في ذاكرة التخزين المؤقت
إرجاع ذاكرة التخزين المؤقت [dsid] ؛ // العودة مباشرة إلى الكائن في ذاكرة التخزين المؤقت
}
var fsb = new uikit.webctrl.searchbox (dsid) ؛ // new
ذاكرة التخزين المؤقت [dsid] = fsb ؛ // تحديث ذاكرة التخزين المؤقت
إذا (count.length> 100) {// يتم ضمان حجم ذاكرة التخزين المؤقت <= 100
حذف ذاكرة التخزين المؤقت [count.shift ()] ؛
}
إرجاع FSB ؛
} ،
ClearSearchBox: Function (dsid) {
إذا (dsid في ذاكرة التخزين المؤقت) {
ذاكرة التخزين المؤقت [dsid] .clearselection () ؛
}
}
} ؛
}) () ؛
CacheDsearchbox.attachSearchBox ("input1") ؛
وبهذه الطريقة ، عندما ندعو cachedsearchbox.atachserachbox ("input1") في المرة الثانية ،
يمكننا الوصول إلى الكائن من ذاكرة التخزين المؤقت دون إنشاء كائن SearchBox جديد.
3 تنفيذ التغليف
دعونا نلقي نظرة أولاً على مثال حول التغليف. لا يمكن الوصول إلى المتغيرات الموجودة خارج الشخص ، ولكن يتم الوصول إليها من خلال توفير الإغلاق:
نسخة الكود كما يلي:
var person = function () {
// نطاق المتغير داخل الوظيفة ولا يمكن الوصول إليه خارج الوظيفة
var name = "default" ؛
يعود {
getName: function () {
اسم العودة
} ،
setName: function (newName) {
الاسم = newName ؛
}
}
} () ؛
طباعة (person.name) ؛ // الوصول المباشر ، والنتيجة غير محددة
print (person.getName ()) ؛
person.setName ("abruzzi") ؛
print (person.getName ()) ؛
النتائج كما يلي:
غير محدد
تقصير
أبروزي
4 غرض مهم آخر من الإغلاق هو تنفيذ كائنات موجهة للكائنات. توفر لغات الكائن التقليدية آليات قالب الطبقة.
وبهذه الطريقة ، فإن الكائنات المختلفة (مثيلات الفصول) لديها أعضاء وحالات مستقلة ولا تتداخل مع بعضها البعض. على الرغم من عدم وجود آلية مثل الطبقة في JavaScript ، باستخدام عمليات الإغلاق ،
يمكننا محاكاة مثل هذه الآلية. دعنا نتحدث عن المثال أعلاه:
نسخة الكود كما يلي:
وظيفة person () {
var name = "default" ؛
يعود {
getName: function () {
اسم العودة
} ،
setName: function (newName) {
الاسم = newName ؛
}
}
} ؛
var John = person () ؛
print (john.getName ()) ؛
John.setName ("John") ؛
print (john.getName ()) ؛
var jack = person () ؛
print (jack.getName ()) ؛
Jack.SetName ("Jack") ؛
print (jack.getName ()) ؛
نتائج التشغيل كما يلي:
تقصير
جون
تقصير
جاك
من هذا الرمز ، يمكننا أن نرى أنه يمكن تسمية كل من John and Jack بمثيلات من فئة الشخص ، لأن الوصول إلى عضو الاسم مستقل ولا يؤثر على بعضهما البعض.
ما سبق هو وظيفة إغلاق JS ، وهو أمر بسيط للغاية وسهل الفهم. آمل أن يكون ذلك مفيدًا لأصدقائي.