سؤال

أنا أفهم ما الإغلاق ولكن أواجه بعض المتاعب grokking بالضبط ما المصطلح closure يشير إلى.لقد رأيت مصطلح يستخدم في العديد من المواقع, ولكن نادرا ما يتفقون على التعريف الفعلي عليه.

  • هي المتغيرات التي يتم الاحتفاظ بها على كومة الإطار ؟
  • هو الدالة التي يتم إرجاعها ؟
  • هو نطاق الخارجي ؟
  • هو نطاق الداخلي (عاد) ؟
  • هو ربما مفهوم حفظ المتغيرات على المكدس الإطار بعد عودته ؟

يمكن أن تقولوا لي بالضبط ما closure يشير إلى ؟

هل كانت مفيدة؟

المحلول

من جافا سكريبت الإغلاق

اثنين واحد في الجملة ملخصات:

إغلاق المتغيرات المحلية من أجل وظيفة - أبقى على قيد الحياة بعد وظيفة قد عاد ، أو

إغلاق كومة الإطار الذي هو لا deallocated عندما وظيفة العوائد.(كما لو كان 'كومة الإطار' كانت malloc رائد بدلا من أن تكون على المكدس!)

مقال جيد جدا على الإغلاق

جافا سكريبت الإغلاق

و "إغلاق" هو تعبير (عادة) وظيفة التي يمكن أن يكون المتغيرات الحرة مع البيئة التي تربط هذه المتغيرات (أن "إغلاق" في التعبير).

شرح بسيط من الإغلاق أن ECMAScript يسمح الداخلية وظائف ؛ تعريفات الدالة ، وظيفة التعبير التي هي داخل وظيفة الهيئات من الوظائف الأخرى.وأن تلك الوظائف الداخلية يسمح الوصول إلى جميع المحلية المتغيرات والمعايير المعلنة الداخلية وظائف ضمن الخارجي وظيفة(ق).إغلاق تتشكل عند واحدة من تلك الداخلية وظائف مصنوع يمكن الوصول إليها من خارج وظيفة في التي كان يتضمنها ، حتى أنه قد يتم تنفيذه بعد الخارجي وظيفة قد عاد.وعند هذه النقطة فإنه لا يزال الوصول إلى المتغيرات المحلية ، المعلمات الداخلية وظيفة إعلانات الخارجي لها وظيفة.تلك المتغيرات المحلية ، المعلمة ، وظيفة الإعلانات (في البداية) قد القيم التي كانوا عندما الخارجي عادت وظيفة و قد يكون تفاعلت مع من خلال وظيفة الداخلية.

وخير مثال هنا

جافا سكريبت, الوقت جروك الإغلاق

نصائح أخرى

إنها وظيفة "تحتوي" على مرجع أو إشارات إلى شيء ما في نطاق آخر.على سبيل المثال:

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

يحدث هذا لأنه عندما يتم "إنشاء" الوظائف، فإنها لا تنسخ قيمة i، بل تحتوي على مرجع إلى i، لذلك عندما نستدعي الوظائف، فإنها تستخدم القيمة الحالية لـ i وهي 3.

هنا شرح رسومي.

بالنسبة لي، تتيح لك عمليات الإغلاق في JS القيام بما يلي.
يظل "a" متاحًا في الوظيفة الداخلية عند إضافته إلى "b" على الرغم من إعلانه بالخارج.

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

للاستفادة القصوى من عمليات إغلاق JS، يمكنك إلقاء نظرة على مصدر الرمز من مكتبة PURE (محرك قوالب JS)

بقدر ما أستطيع أن أقول، الإغلاق هو وظيفة محددة ضمن وظيفة أخرى تتجاوز نطاق الوظيفة الأصلية.ومن الأمثلة الشائعة عمليات الاسترجاعات:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

في هذه الحالة ما سبق function closure يتم تعريفه داخل الجسم delay_message, ولكن تعريف الدالة - بالإضافة إلى متغير الدالة الأصلية msg --تتجاوز نطاق delay_message استدعاء وظيفة.

خذ بعين الاعتبار التعليمة البرمجية التالية التي تنشئ إغلاقًا بالمتغيرين a وb

closure=(function(){ 

    var a=3
    var b=5 

return  function(operation){ 
          return operation(a,b)
      }
 }())


// The variables a and b are now part of the closure (They are retained even after the outer function returns)


closure(function(x,y){return x+y})  // outputs 8

closure(function(x,y){return x*y}) // outputs 15`

يمكن الآن لهذا الإغلاق الخاص أن يأخذ أي دالة تعمل على المتغيرين a وb

الإغلاق في الأساس هو جسم وظيفي مغلق على معرفاته (المتغيرات) داخل بيئته المحلية.

الإغلاق هو قيمة دالة تم إنشاؤها من إعلان دالة متداخلة أو تعبير دالة (أي.تعبير لامدا) الذي يحتوي جسمه على مرجع واحد أو أكثر للمتغيرات المعلنة في نطاق خارجي (ولكن ليس عالميًا).

الإغلاق يعني وظيفة (وظيفة خارجية) تحتوي على وظيفة أخرى (وظيفة داخلية).

يستخدم الإغلاق لحماية البيانات.

يتم توضيح استخدام أقرب في رابط الفيديو أدناه:

https://www.youtube.com/watch?v=w1s9PgtEoJs

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