การปิดคืออะไร?
ลองดูที่รหัสหนึ่งก่อน:
ฟังก์ชั่น a () {var n = 0; ฟังก์ชั่น inc () {n ++; console.log (n); } inc (); inc (); } a (); // คอนโซลเอาต์พุต 1 จากนั้นเอาต์พุต 2มันง่าย มาดูรหัสอีกชิ้นหนึ่ง:
ฟังก์ชั่น a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = ใหม่ a (); c.inc (); // เอาต์พุตคอนโซล 1C.inc (); // เอาต์พุตคอนโซล 2มันง่าย
การปิดคืออะไร? นี่คือการปิด!
ฟังก์ชั่นที่มีการเข้าถึงตัวแปรภายในขอบเขตของฟังก์ชั่นอื่นคือการปิด ที่นี่ฟังก์ชั่น INC เข้าถึงตัวแปร n ในคอนสตรัคเตอร์ A ดังนั้นจึงมีการปิดตัวลง
มาดูรหัสอีกชิ้นหนึ่ง:
ฟังก์ชั่น a () {var n = 0; ฟังก์ชั่น inc () {n ++; console.log (n); } return inc;} var c = a (); c (); // เอาต์พุตคอนโซล 1C (); // เอาต์พุตคอนโซล 2มาดูกันว่ามันถูกดำเนินการอย่างไร:
var c = couter () ประโยคนี้ couter () ส่งคืนฟังก์ชัน inc จากนั้นประโยคนี้เทียบเท่ากับ var c = inc;
C () ประโยคนี้เทียบเท่ากับ Inc (); โปรดทราบ ว่าชื่อฟังก์ชั่นเป็นเพียงตัวระบุ (ตัวชี้ไปยังฟังก์ชั่น) และ () เป็นฟังก์ชันการดำเนินการ
สามประโยคถัดไปแปลเป็น: var c = inc; inc (); inc () ;, มีความแตกต่างระหว่างมันกับรหัสชิ้นแรกหรือไม่? เลขที่
การปิดคืออะไร? นี่คือการปิด!
บทเรียนตำราทั้งหมดต้องการใช้ย่อหน้าสุดท้ายเพื่อแสดงให้เห็นถึงการปิด แต่ฉันคิดว่าสิ่งนี้ทำให้ปัญหาซับซ้อนขึ้น สิ่งที่ส่งคืนที่นี่คือชื่อฟังก์ชั่น นักเรียนที่ไม่เคยเห็นการเขียนโปรแกรม C/C ++ ของ Tan Haoqiang อาจไม่สะท้อนความแตกต่างระหว่างการนำ () หรือไม่ซึ่งหมายความว่าวิธีการเขียนนี้มาพร้อมกับกับดัก แม้ว่าวิธีการเขียนนี้จะโดดเด่นกว่า แต่ฉันก็ยังชอบที่จะทำให้ปัญหาเป็นเอกเทศและดูรหัส 1 และรหัส 2 คุณจะยังคงสับสนเกี่ยวกับการเรียกใช้ฟังก์ชั่นคุณจะสับสนเกี่ยวกับค่า N หรือไม่?
ทำไมคุณต้องเขียนแบบนี้?
เรารู้ว่าแต่ละฟังก์ชั่นของ JS เป็นห้องสีดำขนาดเล็ก สามารถรับข้อมูลภายนอกได้ แต่โลกภายนอกไม่สามารถมองเห็นเนื้อหาภายในได้โดยตรง การวางตัวแปร n ลงในห้องมืดขนาดเล็กยกเว้นฟังก์ชั่น Inc ไม่มีวิธีอื่นที่จะติดต่อกับตัวแปร n ยิ่งไปกว่านั้นการกำหนดตัวแปร N ด้วยชื่อเดียวกันนอกฟังก์ชั่น A ไม่ส่งผลต่อกันและกัน นี่คือการปรับปรุงที่เรียกว่า "การห่อหุ้ม"
เหตุผลที่คุณต้องใช้ฟังก์ชั่น return to return เพื่อระบุ INC นั้นเป็นเพราะฟังก์ชัน INC ไม่สามารถเรียกได้โดยตรงนอกฟังก์ชั่น A ดังนั้น Return Inc จึงเชื่อมโยงกับภายนอก สิ่งนี้ในรหัส 2 เท่านั้นที่เชื่อมโยงกับ Inc กับภายนอก
กับดักทั่วไป
ตรวจสอบสิ่งนี้:
ฟังก์ชั่น createFunctions () {var result = new Array (); สำหรับ (var i = 0; i <10; i ++) {ผลลัพธ์ [i] = function () {return i; - } ผลตอบแทนผลลัพธ์;} var funcs = createFunctions (); สำหรับ (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}เมื่อมองแวบแรกฉันคิดว่ามันเป็นเอาท์พุท 0 ~ 9 แต่ฉันไม่เคยคาดหวังว่ามันจะส่งออก 10 10?
กับดักที่นี่คือ: ฟังก์ชั่นด้วย () คือฟังก์ชั่นการดำเนินการ! ประโยคง่ายๆ var f = function () {Alert ('hi'); - จะไม่ปรากฏขึ้นและประโยคต่อไปนี้ f (); จะเรียกใช้รหัสภายในฟังก์ชั่น รหัสด้านบนแปลเป็น:
var result = new Array (), i; ผลลัพธ์ [0] = function () {return i; - // ฟังก์ชั่นไม่ได้ดำเนินการฟังก์ชั่นยังคงไม่เปลี่ยนแปลงและไม่สามารถเปลี่ยนฟังก์ชั่นได้! ผลลัพธ์ [1] = function () {return i; - // ฟังก์ชั่นไม่ได้ดำเนินการฟังก์ชั่นยังคงไม่เปลี่ยนแปลงและไม่สามารถเปลี่ยนฟังก์ชั่นได้! ... ผลลัพธ์ [9] = function () {return i; - // ฟังก์ชั่นไม่ได้ดำเนินการฟังก์ชั่นยังคงไม่เปลี่ยนแปลงและไม่สามารถเปลี่ยนฟังก์ชั่นได้! i = 10; funcs = ผลลัพธ์; ผลลัพธ์ = null; console.log (i); // funcs [0] () คือการเรียกใช้คำสั่ง Return I ซึ่งก็คือการส่งคืน 10console.log (i); // funcs [1] () คือการเรียกใช้คำสั่ง Return I ซึ่งก็คือการส่งคืน 10 ... console.log (i); // funcs [9] () คือการเรียกใช้คำสั่ง Return I ซึ่งก็คือการส่งคืน 10เหตุใดจึงเป็นเพียงผลการรวบรวมขยะ แต่ไม่ใช่ฉัน? เพราะฉันยังคงถูกอ้างอิงโดยฟังก์ชั่น มันเหมือนร้านอาหารที่มีจาน จำกัด อยู่เสมอดังนั้นพนักงานเสิร์ฟจะไปลาดตระเวนไต้หวันเพื่อรีไซเคิลแผ่นที่ว่างเปล่า แต่เขากล้าเก็บจานที่ยังมีผักได้อย่างไร แน่นอนถ้าคุณเทจานด้วยตนเอง (= null) ในจานด้วยตัวเองจานจะถูกนำออกไป นี่คือกลไกการรีไซเคิลหน่วยความจำที่เรียกว่า
สำหรับวิธีที่คุณค่าของฉันยังสามารถเก็บรักษาไว้ในความเป็นจริงการอ่านมันไปตลอดทางตั้งแต่เริ่มต้นของบทความไม่ควรเป็นอะไรที่ต้องกังวล ไม่จำเป็นต้องกินจานหนึ่งชิ้นบนจานเพื่อสูญเสียชิ้นเดียวหรือไม่?
มาสรุปกันเถอะ
การปิดเป็นตัวแปรที่ฟังก์ชั่นหมายถึงฟังก์ชั่นอื่น เนื่องจากตัวแปรถูกอ้างอิงมันจะไม่ถูกรีไซเคิลดังนั้นจึงสามารถใช้ในการห่อหุ้มตัวแปรส่วนตัว นี่คือข้อได้เปรียบและข้อเสีย การปิดที่ไม่จำเป็นจะเพิ่มการใช้หน่วยความจำเท่านั้น! นอกจากนี้เมื่อใช้การปิดคุณควรให้ความสนใจว่ามูลค่าของตัวแปรตรงกับความต้องการของคุณหรือไม่เพราะมันเป็นเหมือนตัวแปรส่วนตัวแบบคงที่ การปิดมักจะผสมกับหลายสิ่งหลายอย่างและหลังจากติดต่อพวกเขาด้วยความเข้าใจที่มากขึ้นเราจะทำให้เราเข้าใจลึกซึ้งยิ่งขึ้น ที่นี่เราแค่พูดถึงเรื่องพื้นฐาน
ลิงก์ไปยังบทความนี้: http://www.cnblogs.com/qieguo/p/5457040.html
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน