1. ما هي كتابة واستخدام الإغلاق والإغلاق
1. ما هو الإغلاق
الإغلاق ، التفسير الرسمي للإغلاق هو: تعبير (عادةً وظيفة) له العديد من المتغيرات والبيئة المرتبطة بهذه المتغيرات ، لذلك هذه المتغيرات هي أيضًا جزء من التعبير. ميزات الإغلاق:
1). كمرجع إلى متغير الوظيفة ، يكون في حالة نشطة عند إرجاع الوظيفة.
2). الإغلاق هو منطقة مكدس حيث لا يتم إطلاق موارد عند إرجاع وظيفة.
ببساطة ، تسمح JavaScript باستخدام الوظائف الداخلية - أي تعريفات الوظائف وتعبيرات الوظائف موجودة في جسم وظيفة وظيفة أخرى. علاوة على ذلك ، يمكن لهذه الوظائف الداخلية الوصول إلى جميع المتغيرات المحلية والمعلمات والوظائف الداخلية الأخرى المعلنة في الوظيفة الخارجية حيث يقيمون. عندما يتم استدعاء إحدى هذه الوظائف الداخلية خارج الوظيفة الخارجية التي تحتوي عليها ، يتم تشكيل إغلاق.
2. عدة طرق للكتابة واستخدام عمليات الإغلاق
بادئ ذي بدء ، يجب أن نفهم أن كل شيء في JS هو كائن ، والوظيفة هي نوع من الكائن. دعونا أولاً نلقي نظرة على الطرق الخمس لكتابة عمليات الإغلاق وفهم بإيجاز ماهية الإغلاق. سيتم تقديم تفسير مفصل لاحقًا.
// دائرة وظيفة الكتابة الأولى (r) {this.r = r ؛ } circle.pi = 3.14159 ؛ circle.prototype.area = function () {return circle.pi * this.r * this.r ؛ } var c = New Dircle (1.0) ؛ تنبيه (c.area ()) ؛طريقة الكتابة هذه ليست مميزة ، فهي تضيف بعض الخصائص إلى الوظيفة.
// الطريقة الثانية لكتابة var circle = function () {var obj = new Object () ؛ OBJ.PI = 3.14159 ؛ obj.area = function (r) {return this.pi * r * r ؛ } إرجاع OBJ ؛ } var c = New Circle () ؛ تنبيه (c.area (1.0)) ؛طريقة الكتابة هذه هي إعلان متغير وتعيين وظيفة لمتغير كقيمة.
// الطريقة الثالثة لكتابة Var Circle = new Object () ؛ Circle.PI = 3.14159 ؛ circle.area = function (r) {return this.pi * r * r ؛ } ALERT (circle.area (1.0)) ؛من الأفضل فهم هذه الطريقة ، والتي تتمثل في شيء جديد ثم إضافة خصائص وطرق إلى الكائن.
// الطريقة الرابعة لكتابة var circle = {"pi": 3.14159 ، "area": function (r) {return this.pi * r * r ؛ }} ؛ تنبيه (Circle.area (1.0)) ؛يتم استخدام هذه الطريقة بشكل متكرر أكثر وهي الأكثر ملاءمة. var obj = {} هو إعلان كائن فارغ.
// الطريقة الخامسة لكتابة Var Circle = وظيفة جديدة ("this.pi = 3.14159 ؛ this.area = function (r) {return r*r*this.pi ؛}") ؛ تنبيه ((دائرة جديدة ()). المنطقة (1.0)) ؛لأكون صادقًا ، لم أستخدم طريقة الكتابة هذه أبدًا ، حتى تتمكن من الرجوع إليها.
بشكل عام ، تكون الطرق المذكورة أعلاه أكثر شيوعًا في الثانية والرابعة ، ويمكنك الاختيار وفقًا لعاداتك.
يظهر النموذج الأولي الشائع في JS في الكود أعلاه ، فما هو استخدام النموذج الأولي؟ لنلقي نظرة عليه أدناه:
var dom = function () {} ؛ dom.show = function () {Alert ("show message") ؛ } ؛ dom.prototype.display = function () {Alert ("property message") ؛ } ؛ Dom.Display () ؛ // error dom.show () ؛ var d = new dom () ؛ D.Display () ؛ D.Show () ؛ //خطأنعلن أولاً متغيرًا ونخصص وظيفة له ، لأنه في JavaScript كل وظيفة لها خاصية portotype ، والكائن لا. أضف طريقتين ، إضافة مباشرة وكسر النموذج الأولي أعلاه ، وشاهد موقف المكالمة. نتائج التحليل هي كما يلي:
1. طريقة الكائن المحددة بواسطة سمة النموذج الأولي هي طريقة ثابتة ولا يمكن استدعاؤها مباشرة مع اسم الفصل! بالإضافة إلى ذلك ، لا يمكن استخدام هذا المتغير في هذه الطريقة الثابتة لاستدعاء خصائص أخرى للكائن!
2. طريقة الكائن المحددة باستخدام سمة النموذج الأولي هي طريقة غير قاسية ولا يمكن استخدامها إلا بعد التثبيت! هذا يمكن أن يشير إلى خصائص أخرى في الكائن نفسه داخل الطريقة!
دعونا نلقي نظرة على رمز آخر:
var dom = function () {var name = "default" ؛ this.sex = "boy" ؛ this.success = function () {Alert ("success") ؛ } ؛ } ؛ تنبيه (dom.name) ؛ تنبيه (dom.sex) ؛دعونا نلقي نظرة أولاً ، ماذا سيتم عرضه؟ الجواب هو أن كلاهما يتم عرضه غير محدد ، لماذا؟ هذا لأنه في JavaScript تشكل كل وظيفة نطاقًا ، ويتم إعلان هذه المتغيرات في الوظيفة ، لذلك فهي في نطاق هذه الوظيفة ولا يمكن الوصول إليها إلى الخارج. للوصول إلى المتغيرات ، يجب عليك مثيلات جديدة.
var html = {name: 'object' ، success: function () {this.say = function () {Alert ("Hello ، World") ؛ } ؛ تنبيه ("نجاح OBJ") ؛ }} ؛دعونا نلقي نظرة على طريقة الكتابة هذه. في الواقع ، هذا "سكر نحوي" في جافا سكريبت. طريقة الكتابة هذه تعادل:
var html = new Object () ؛ html.name = 'object' ؛ html.success = function () {this.say = function () {Alert ("Hello ، World") ؛ } ؛ تنبيه ("نجاح OBJ") ؛المتغير HTML هو كائن ، وليس دالة ، لذلك لا يحتوي على سمة النموذج الأولي ، وطرقه كلها طرق عامة ، ولا يمكن تثبيت HTML. خلاف ذلك ، سيظهر الخطأ التالي:
ولكن يمكن تعيينه إلى متغيرات أخرى كقيمة ، مثل var o = html ؛ يمكننا استخدامه مثل هذا:
تنبيه (html.name) ؛
html.success () ؛
الحديث عن هذا ، هل انتهى؟ قد يسأل الأشخاص الحرصون ، كيفية الوصول إلى طريقة Say في طريقة النجاح؟ هل هو html.success.say ()؟
بالطبع لا. كما ذكر أعلاه ، بسبب قيود النطاق ، لا يمكن الوصول إليها. لذلك تحتاج إلى الوصول إليه باستخدام الطريقة التالية:
var s = new html.success () ؛ s.say () ؛ // يمكنك أيضًا الكتابة إلى html.success.prototype.show = function () {Alert ("haha") ؛} ؛ var s = new html.success () ؛ s.show () ؛فيما يتعلق بنطاق JavaScript ، لا يمكن تفسيره بوضوح في جملة واحدة أو جملة. إذا كنت مهتمًا ، فيمكنك العثور على بعض المعلومات عبر الإنترنت.
2. الغرض من إغلاق JavaScript
في الواقع ، باستخدام عمليات الإغلاق ، يمكننا القيام بالكثير من الأشياء. على سبيل المثال ، محاكاة نمط الكود الموجهة للكائنات ؛ الكود التعبير أكثر أناقة وإيجازًا ؛ وتحسين كفاءة تنفيذ الكود في بعض الجوانب.
1. وظيفة التنفيذ الذاتي المجهولة
نحن نعلم أنه إذا لم تتم إضافة جميع المتغيرات مع الكلمة الرئيسية VAR ، فسيتم إضافة الافتراضي إلى خصائص الكائن العالمي. هناك العديد من العيوب لإضافة مثل هذه المتغيرات المؤقتة إلى الكائن العالمي.
على سبيل المثال: قد تسيء الوظائف الأخرى استخدام هذه المتغيرات ؛ إن التسبب في أن يكون الكائن العالمي كبيرًا جدًا ويؤثر على سرعة الوصول (لأن قيمة المتغير يجب اجتيازها من سلسلة النموذج الأولي).
بالإضافة إلى استخدام الكلمة الرئيسية VAR في كل مرة نستخدم فيها المتغير ، غالبًا ما نواجه موقفًا لا يلزم تنفيذ بعض الوظائف إلا مرة واحدة ولا يلزم الحفاظ على متغيراتها الداخلية ، مثل تهيئة واجهة المستخدم ، حتى نتمكن من استخدام عمليات الإغلاق:
var data = {table: [] ، tree: {}} ؛ (الدالة (dm) {for (var i = 0 ؛ i <dm.table.rows ؛ i ++) {var row = dm.table.rows [i] ؛ for (var j = 0 ؛ j <row.cells ؛ i ++) {drawCell (i ، j) ؛}}}) (البيانات) ؛نقوم بإنشاء وظيفة مجهولة وتنفيذها على الفور. نظرًا لأن الخارجي لا يمكنه الإشارة إلى المتغيرات الموجودة بداخله ، فسيتم إصدار المورد فور تنفيذ الوظيفة. المفتاح ليس تلوث الكائن العالمي.
2. ذاكرة التخزين المؤقت نتيجة
سوف نواجه العديد من المواقف في التنمية. تخيل أن لدينا كائن وظيفة يستغرق وقتًا طويلاً يستغرق وقتًا طويلاً لمعالجة كل مكالمة.
ثم نحتاج إلى تخزين القيمة المحسوبة. عند استدعاء هذه الوظيفة ، نبحث أولاً في ذاكرة التخزين المؤقت. إذا كان لا يمكن العثور عليها ، فسنحسبها ، ثم قم بتحديث ذاكرة التخزين المؤقت وإرجاع القيمة. إذا تم العثور عليه ، يمكننا إعادة القيمة التي تم العثور عليها مباشرة. تقوم عمليات الإغلاق بالتحديد لأنها لا تحرر مراجع خارجية ، بحيث يمكن الحفاظ على القيم الموجودة داخل الوظيفة.
var cacheDsearchBox = (function () {var cache = {} ، count = [] ؛ return {attachSearchBox: function (dsid) {if (dsid in cache) {// إذا كانت النتيجة في ذاكرة التخزين المؤقت لذاكرة التخزين المؤقت [dsid] ؛ ذاكرة التخزين المؤقت [DSID] = FSB ؛ CacheDsearchBox.attachSearchBox ("الإدخال") ؛وبهذه الطريقة ، سوف نقرأ الكائن من ذاكرة التخزين المؤقت في المكالمة الثانية.
3. التغليف
var person = function () {// يكون نطاق المتغير داخل الوظيفة ، ولا يمكن الوصول إلى اسم var في الخارج. var name = "default" ؛ إرجاع {getName: function () {return name ؛ } ، setName: function (newName) {name = newName ؛ }}} () ؛ print (person.name) ؛ // Access مباشرة ، والنتيجة هي طباعة غير محددة (person.getName ()) ؛ person.setName ("abruzzi") ؛ print (person.getName ()) ؛النتائج كما يلي:
غير محدد
تقصير
أبروزي
4. تنفيذ الفصول والميراث
وظيفة person () {var name = "default" ؛ إرجاع {getName: function () {return name ؛ } ، setName: function (newName) {name = newName ؛ }}} ؛ var p = شخص جديد () ؛ P.SetName ("توم") ؛ ALERT (p.getName ()) ؛ var jack = function () {} ؛ // الموروثة من شخص jack.prototype = شخص جديد () ؛ // إضافة طريقة خاصة jack.prototype.say = function () {Alert ("Hello ، My Name is Jack") ؛ } ؛ var j = new Jack () ؛ J.SetName ("جاك") ؛ J.Say () ؛ ALERT (jetgetName ()) ؛نحن نحدد الشخص ، إنه مثل الفصل ، نحن نصل إلى كائن شخص جديد ، ونصل إلى طريقته.
أدناه نحدد جاك ، وراثة الشخص ، ونضيف أساليبنا الخاصة.
ملخص شخصي:
اعتدت أن أعتقد أن JavaScript كان مجرد فرع من Java ، وهي لغة نصية ، وكان من السهل التعلم ، لكن الآن أجد أن هناك الكثير من الأشياء التي يجب تعلمها. جافا سكريبت أقوى بكثير مما كنا نظن.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.