จะเขียนสิ่งนี้ในกาแฟได้อย่างไร?
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