จะเขียนสิ่งนี้ในกาแฟได้อย่างไร?
f = (function(){
// something
})();
ขอบคุณสำหรับคำแนะนำ :)
จะเขียนสิ่งนี้ในกาแฟได้อย่างไร?
f = (function(){
// something
})();
ขอบคุณสำหรับคำแนะนำ :)
คำตอบ:
ในขณะที่คุณสามารถใช้วงเล็บได้ (เช่น(-> 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 ครั้ง
-> console.log 'this runs right away'ให้fแล้วเรียกใช้ ของคุณเรียกใช้ฟังก์ชันจากนั้นกำหนดผลลัพธ์ให้fเช่นเดียวกับคำถามเดิม (แม้ว่าในกรณีนี้console.logค่าส่งคืนจะยังคงundefinedอยู่เสมอ)
{f: do -> // something}
doยังให้คุณส่งผ่านอาร์กิวเมนต์ไปยังฟังก์ชัน ที่จะผ่าน1และ2เป็นพารามิเตอร์xและเขียนy do (x = 1, y = 2) ->(เอกสารสำหรับคุณลักษณะนี้สูญหายไปแล้ว แต่ปัญหาที่นำเสนอคุณลักษณะนี้มีตัวอย่างบางส่วน)
หากคุณต้องการ "นามแฝง" อาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันเรียกใช้ตัวเองใน CoffeeScript และสมมติว่านี่คือสิ่งที่คุณพยายามบรรลุ:
(function ( global, doc ) {
// your code in local scope goes here
})( window, document );
แล้วdo (window, document) ->จะไม่ให้คุณทำอย่างนั้น. วิธีที่จะไปคือ parens แล้ว:
(( global, doc ) ->
# your code here
)( window, document )
do (global=window, doc=document) ->
มันง่ายไร้สาระในกาแฟ:
do ->
จะกลับมา
(function() {})();
คุณยังสามารถรวมdoคีย์เวิร์ดกับพารามิเตอร์ฟังก์ชันเริ่มต้นเพื่อสร้าง "ฟังก์ชันเริ่มต้นด้วยตัวเอง" แบบเรียกซ้ำด้วยค่าเริ่มต้น ตัวอย่าง:
do recursivelyPrint = (a=0) ->
console.log a
setTimeout (-> recursivelyPrint a + 1), 1000
ลองใช้
do ($ = jQuery) ->
do ->
#your stuff here
สิ่งนี้จะสร้างการปิดการดำเนินการด้วยตนเองซึ่งมีประโยชน์สำหรับการกำหนดขอบเขต
ขอโทษฉันแก้ไขแล้ว:
f = (
() -> "something"
)()
doคำหลักที่มีข้อ จำกัด บางอย่างที่ทำให้มันจำเป็นที่จะใช้วิธีการ JS-สไตล์บางครั้ง (ดูปัญหา 960 ); doถูกเพิ่มเข้ามาเพราะกรณีการใช้งานแบบวนซ้ำด้วยการปิดเท่านั้น
มันควรจะเป็น
f = () ->
# do something
f = do -> console.log x