คำถามติดแท็ก closures

การปิดเป็นฟังก์ชั่นชั้นหนึ่งที่อ้างถึงตัวแปร (ปิด) กว่าจากขอบเขตที่มันถูกกำหนด หากการปิดยังคงมีอยู่หลังจากขอบเขตการกำหนดสิ้นสุดลงตัวแปรที่ปิดลงจะยังคงมีอยู่เช่นกัน

30
การปิด JavaScript ทำงานอย่างไร
คำตอบของคำถามนี้เป็นความพยายามของชุมชน แก้ไขคำตอบที่มีอยู่เพื่อปรับปรุงโพสต์นี้ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ Наэтотвопросестьответына Stack Overflow нарусском : Какработаютзамыканияв JavaScript คุณจะอธิบายวิธีปิด JavaScript ให้คนที่มีความรู้เกี่ยวกับแนวคิดที่พวกเขาประกอบด้วย (เช่นฟังก์ชั่นตัวแปรและสิ่งที่คล้ายกัน) แต่ไม่เข้าใจว่าปิดตัวเองได้อย่างไร ฉันเคยเห็นตัวอย่างโครงการที่ให้ไว้ใน Wikipedia แต่น่าเสียดายที่มันไม่ได้ช่วย

30
การปิด JavaScript ภายในลูป - ตัวอย่างง่ายๆในทางปฏิบัติ
Наэтотвопросестьответына กองมากเกินнарусском : Почемуасинхроннаяфункциявнутрициклавыполняетпоследнююитерацию многораз ? var funcs = []; // let's create 3 functions for (var i = 0; i < 3; i++) { // and store them in funcs funcs[i] = function() { // each should log its value. console.log("My value: " + i); }; } for (var …

26
ทำไม Lambdas ของ Python จึงมีประโยชน์ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันพยายามที่จะเข้าใจลูกแกะงูหลาม แลมบ์ดาเป็นหนึ่งในรายการภาษาที่ "น่าสนใจ" ที่ควรลืมในชีวิตจริงหรือไม่? ฉันแน่ใจว่ามีบางกรณีที่อาจจำเป็นต้องใช้ขอบ แต่เนื่องจากความคลุมเครือของมันศักยภาพของมันถูกนิยามใหม่ในรุ่นอนาคต (สมมติฐานของฉันขึ้นอยู่กับคำจำกัดความต่าง ๆ ของมัน) และลดความชัดเจนของการเข้ารหัส ต้องหลีกเลี่ยง? สิ่งนี้ทำให้ฉันนึกถึงการโอเวอร์โฟลว์ (บัฟเฟอร์โอเวอร์โฟลว์) ของชนิด C - ชี้ไปที่ตัวแปรด้านบนและการโหลดมากเกินไปเพื่อตั้งค่าฟิลด์อื่น มันให้ความรู้สึกเหมือนเป็นนักแสดงที่มีความเชี่ยวชาญ แต่เป็นฝันร้ายของผู้ดูแลรหัส

11
อะไรคือความแตกต่างระหว่าง 'การปิด' และ 'แลมบ์ดา'?
มีคนอธิบายได้ไหม ฉันเข้าใจแนวคิดพื้นฐานที่อยู่เบื้องหลังพวกเขา แต่ฉันมักจะเห็นพวกเขาใช้สลับกันได้และฉันสับสน และตอนนี้เราอยู่ที่นี่พวกเขาแตกต่างจากฟังก์ชั่นปกติอย่างไร


12
JavaScript ปิดกับฟังก์ชั่นที่ไม่ระบุชื่อ
เพื่อนของฉันและฉันกำลังพูดถึงสิ่งที่ปิดใน JS และสิ่งที่ไม่ เราแค่ต้องการให้แน่ใจว่าเราเข้าใจมันอย่างถูกต้อง ลองดูตัวอย่างนี้ เรามีการนับลูปและต้องการพิมพ์ตัวแปรตัวนับบนคอนโซลล่าช้า ดังนั้นเราจึงใช้setTimeoutและปิดเพื่อจับค่าของตัวแปรตัวนับเพื่อให้แน่ใจว่ามันจะไม่พิมพ์ N คูณค่า N วิธีการแก้ปัญหาที่ผิดโดยไม่ปิดหรืออะไรก็ตามที่ใกล้กับการปิดคือ: for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); } ซึ่งแน่นอนว่าจะพิมพ์ค่าของiลูปหลัง10 เท่าคือ 10 ดังนั้นความพยายามของเขาคือ: for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); } …


6
ใน PHP การปิดคืออะไรและเหตุใดจึงใช้ตัวระบุ“ ใช้”
ฉันกำลังตรวจสอบPHP 5.3.0คุณสมบัติบางอย่างและพบรหัสบางส่วนในเว็บไซต์ที่ดูค่อนข้างตลก: public function getTotal($tax) { $total = 0.00; $callback = /* This line here: */ function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2); } เป็นหนึ่งในตัวอย่างในฟังก์ชั่นที่ไม่ระบุชื่อ มีใครรู้เรื่องนี้บ้างไหม? เอกสารอะไรบ้าง? และมันดูชั่วร้ายมันควรจะถูกนำมาใช้?
407 php  closures 

10
สิ่งที่รองรับ JavaScript นี้สำนวน: var self = this?
ฉันเห็นสิ่งต่อไปนี้ในแหล่งที่มาสำหรับการสาธิตหมายเหตุการจัดเก็บ WebKit HTML 5 SQL : function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // ... } ผู้เขียนใช้ตัวเองในบางสถานที่ (ร่างกายฟังก์ชั่น) และสิ่งนี้ในสถานที่อื่น ๆ (ร่างกายของฟังก์ชั่นที่กำหนดไว้ในรายการอาร์กิวเมนต์ของวิธีการ) เกิดอะไรขึ้น? ตอนนี้ฉันสังเกตเห็นครั้งหนึ่งฉันจะเริ่มเห็นมันทุกที่หรือไม่?

9
Python คำสั่ง nonlocal
nonlocalคำสั่งPython ทำอะไร (ใน Python 3.0 และใหม่กว่า) ไม่มีเอกสารประกอบในเว็บไซต์ Python อย่างเป็นทางการและhelp("nonlocal")ใช้งานไม่ได้

3
การเข้าถึงการปิดการแก้ไข
string [] files = new string[2]; files[0] = "ThinkFarAhead.Example.Settings.Configuration_Local.xml"; files[1] = "ThinkFarAhead.Example.Settings.Configuration_Global.xml"; //Resharper complains this is an "access to modified closure" for (int i = 0; i < files.Length; i++ ) { // Resharper disable AccessToModifiedClosure if(Array.Exists(Assembly.GetExecutingAssembly().GetManifestResourceNames(), delegate(string name) { return name.Equals(files[i]); })) return Assembly.GetExecutingAssembly().GetManifestResourceStream(files[i]); // ReSharper restore AccessToModifiedClosure } …
316 c#  resharper  closures 

21
ตัวทดแทนฟังก์ชันที่ใกล้ที่สุดใน Java คืออะไร
ฉันมีวิธีที่เกี่ยวกับโค้ดสิบบรรทัด ฉันต้องการสร้างวิธีการเพิ่มเติมที่ทำสิ่งเดียวกันยกเว้นการคำนวณขนาดเล็กที่จะเปลี่ยนรหัสหนึ่งบรรทัด นี่เป็นแอปพลิเคชั่นที่สมบูรณ์แบบสำหรับการส่งผ่านตัวชี้ฟังก์ชันเพื่อแทนที่หนึ่งบรรทัด แต่ Java ไม่มีตัวชี้ฟังก์ชัน ทางเลือกที่ดีที่สุดของฉันคืออะไร

22
การใช้งานจริงสำหรับการปิด JavaScript คืออะไร?
ฉันพยายามอย่างเต็มที่ที่จะปิดหัวจาวาไว้ที่การปิด JavaScript ฉันได้รับโดยการคืนค่าฟังก์ชันภายในมันจะสามารถเข้าถึงตัวแปรใด ๆ ที่กำหนดไว้ในพาเรนต์ทันที สิ่งนี้จะเป็นประโยชน์กับฉันไหม? บางทีฉันอาจไม่ได้รับความสนใจ ตัวอย่างส่วนใหญ่ที่ฉันเห็นทางออนไลน์นั้นไม่มีรหัสโลกที่แท้จริงเพียงแค่ตัวอย่างที่คลุมเครือ บางคนสามารถแสดงให้ฉันเห็นว่าโลกแห่งความจริงใช้การปิดตัวหรือไม่? เป็นเช่นนี้หรือไม่ var warnUser = function (msg) { var calledCount = 0; return function() { calledCount++; alert(msg + '\nYou have been warned ' + calledCount + ' times.'); }; }; var warnForTamper = warnUser('You can not tamper with our HTML.'); warnForTamper(); warnForTamper();

7
ทำไมฟังก์ชั่นซ้อนกันของไพ ธ อนจึงไม่เรียกว่าการปิด
ฉันได้เห็นและใช้ฟังก์ชั่นที่ซ้อนกันใน Python และมันตรงกับคำจำกัดความของการปิด ดังนั้นทำไมพวกเขาเรียกว่าnested functionsแทนclosures? ฟังก์ชั่นที่ซ้อนกันไม่ปิดเพราะไม่ได้ใช้งานจากโลกภายนอกหรือไม่? UPDATE:ฉันกำลังอ่านเกี่ยวกับการปิดและมันทำให้ฉันคิดถึงแนวคิดนี้เกี่ยวกับ Python ฉันค้นหาและพบบทความที่มีคนพูดถึงในความคิดเห็นด้านล่าง แต่ฉันไม่สามารถเข้าใจคำอธิบายในบทความนั้นได้อย่างสมบูรณ์ดังนั้นนี่คือเหตุผลที่ฉันถามคำถามนี้

6
ฟังก์ชั่น (แลมบ์ดา) ปิดการจับภาพอย่างไร
เมื่อเร็ว ๆ นี้ฉันเริ่มเล่นกับ Python และฉันพบสิ่งแปลก ๆ ในวิธีการปิดการทำงาน พิจารณารหัสต่อไปนี้: adders=[0,1,2,3] for i in [0,1,2,3]: adders[i]=lambda a: i+a print adders[1](3) มันสร้างอาเรย์อย่างง่ายของฟังก์ชั่นที่รับอินพุตเดี่ยวและส่งคืนอินพุตที่เพิ่มโดยตัวเลข ฟังก์ชั่นที่มีการสร้างขึ้นในforวงที่การทำซ้ำโดยiวิ่งจากไป0 3สำหรับตัวเลขเหล่านี้แต่ละlambdaฟังก์ชั่นจะถูกสร้างขึ้นเพื่อรวบรวมiและเพิ่มเข้าไปในอินพุตของฟังก์ชัน บรรทัดสุดท้ายเรียกใช้lambdaฟังก์ชันที่สองโดย3ใช้เป็นพารามิเตอร์ 6ที่แปลกใจของการส่งออกเป็น 4ผมคาดว่า เหตุผลของฉันคือ: ใน Python ทุกอย่างเป็นวัตถุดังนั้นทุกตัวแปรจึงเป็นตัวชี้ที่สำคัญสำหรับมัน เมื่อสร้างlambdaปิดสำหรับผมคาดว่ามันเก็บชี้ไปยังวัตถุจำนวนเต็มชี้ปัจจุบันโดยi iนั่นหมายความว่าเมื่อiกำหนดวัตถุจำนวนเต็มใหม่มันจะไม่ส่งผลต่อการปิดที่สร้างไว้ก่อนหน้านี้ น่าเศร้าที่การตรวจสอบaddersอาร์เรย์ภายในโปรแกรมดีบั๊กเกอร์แสดงว่าทำเช่นนั้น ทุกlambdaฟังก์ชั่นหมายถึงค่าสุดท้ายของi, 3ซึ่งส่งผลให้กลับมาadders[1](3)6 ซึ่งทำให้ฉันสงสัยเกี่ยวกับสิ่งต่อไปนี้: สิ่งที่ปิดการจับภาพที่แน่นอน? เป็นวิธีที่สวยงามที่สุดในการโน้มน้าวให้lambdaฟังก์ชั่นในการจับมูลค่าปัจจุบันiในทางที่จะไม่ได้รับผลกระทบเมื่อiเปลี่ยนค่าของมันคืออะไร?
249 python  lambda  closures 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.