Coffeescript - จะสร้างฟังก์ชันที่ไม่ระบุตัวตนเริ่มต้นได้อย่างไร?


คำตอบ:


160

ในขณะที่คุณสามารถใช้วงเล็บได้ (เช่น(-> foo)()คุณสามารถหลีกเลี่ยงได้โดยใช้doคำสำคัญ:

do f = -> console.log 'this runs right away'

การใช้งานที่พบบ่อยที่สุดdoคือการจับตัวแปรในวง ตัวอย่างเช่น

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

หากไม่มีdoคุณจะพิมพ์ค่าของxหลังจากวนซ้ำ 3 ครั้ง


24
คุณยังสามารถเขียนได้f = do -> console.log x
scribu

5
@scribu คำทั้งสองนี้แตกต่างกันมากและของคุณเป็นข้อความที่ฉันควรให้ Mine กำหนดฟังก์ชัน-> console.log 'this runs right away'ให้fแล้วเรียกใช้ ของคุณเรียกใช้ฟังก์ชันจากนั้นกำหนดผลลัพธ์ให้fเช่นเดียวกับคำถามเดิม (แม้ว่าในกรณีนี้console.logค่าส่งคืนจะยังคงundefinedอยู่เสมอ)
Trevor Burnham

1
ตรง นอกจากนี้คุณสามารถกำหนดคุณสมบัติของวัตถุด้วยวิธีนี้:{f: do -> // something}
scribu

2
ตั้งแต่ CoffeeScript 1.3.1 (เผยแพร่เมื่อเดือนเมษายน 2555) doยังให้คุณส่งผ่านอาร์กิวเมนต์ไปยังฟังก์ชัน ที่จะผ่าน1และ2เป็นพารามิเตอร์xและเขียนy do (x = 1, y = 2) ->(เอกสารสำหรับคุณลักษณะนี้สูญหายไปแล้ว แต่ปัญหาที่นำเสนอคุณลักษณะนี้มีตัวอย่างบางส่วน)
Rory O'Kane

19

หากคุณต้องการ "นามแฝง" อาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันเรียกใช้ตัวเองใน CoffeeScript และสมมติว่านี่คือสิ่งที่คุณพยายามบรรลุ:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

แล้วdo (window, document) ->จะไม่ให้คุณทำอย่างนั้น. วิธีที่จะไปคือ parens แล้ว:

(( global, doc ) -> 
  # your code here
)( window, document ) 

5
do (global=window, doc=document) ->
Billy Moon


5

คุณยังสามารถรวมdoคีย์เวิร์ดกับพารามิเตอร์ฟังก์ชันเริ่มต้นเพื่อสร้าง "ฟังก์ชันเริ่มต้นด้วยตัวเอง" แบบเรียกซ้ำด้วยค่าเริ่มต้น ตัวอย่าง:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

สิ่งนี้จะสร้างการปิดการดำเนินการด้วยตนเองซึ่งมีประโยชน์สำหรับการกำหนดขอบเขต


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

1

ขอโทษฉันแก้ไขแล้ว:

f = (
    () -> "something"
)()

1
@Squeegy ฉันไม่จำเป็นต้องพูดอย่างนั้น doคำหลักที่มีข้อ จำกัด บางอย่างที่ทำให้มันจำเป็นที่จะใช้วิธีการ JS-สไตล์บางครั้ง (ดูปัญหา 960 ); doถูกเพิ่มเข้ามาเพราะกรณีการใช้งานแบบวนซ้ำด้วยการปิดเท่านั้น
Trevor Burnham

1
แต่เราไม่ได้ใช้ CoffeeScript เพื่อต่อยหน้าตัวเองแบบนั้นเช่นกัน
Brandon

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