ตั้งแต่สคริปต์กาแฟไม่มีvar
คำสั่งโดยอัตโนมัติแทรกสำหรับตัวแปรทั้งหมดในกาแฟสคริปต์ว่าวิธีที่จะป้องกันไม่ให้รุ่น JavaScript รวบรวมจากการรั่วไหลทุกอย่างลงในnamespace โลก
ดังนั้นเนื่องจากมีวิธีที่จะทำให้สิ่งที่ "รั่ว" ในไม่มีnamespace โลกจากด้านกาแฟสคริปต์ของสิ่งที่เกี่ยวกับวัตถุประสงค์คุณจำเป็นต้องกำหนดตัวแปรทั่วโลกของคุณเป็นคุณสมบัติของวัตถุทั่วโลก
แนบเป็นคุณสมบัติในหน้าต่าง
ซึ่งหมายความว่าคุณจะต้องทำสิ่งที่ชอบwindow.foo = 'baz';
ซึ่งจัดการกรณีที่เบราว์เซอร์เนื่องจากมีวัตถุทั่วโลกwindow
เป็น
Node.js
ใน Node.js ไม่มีwindow
วัตถุ แต่มีexports
วัตถุที่ถูกส่งผ่านเข้าไปใน wrapper ที่ล้อมโมดูล Node.js (ดูที่: https://github.com/ry/node/blob/master/src/node.js# L321 ) ดังนั้นใน Node.js exports.foo = 'baz';
สิ่งที่คุณจะต้องทำคือ
ตอนนี้ให้เราดูสิ่งที่ระบุไว้ในใบเสนอราคาของคุณจากเอกสาร:
... กำหนดเป้าหมายทั้ง CommonJS และเบราว์เซอร์: root = export หรือไม่ นี้
เห็นได้ชัดว่านี่เป็นสคริปต์กาแฟดังนั้นลองมาดูกันว่าสิ่งที่รวบรวมไว้เพื่อ:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
ก่อนอื่นจะตรวจสอบว่าexports
มีการกำหนดหรือไม่เนื่องจากพยายามอ้างอิงตัวแปรที่ไม่มีอยู่ใน JavaScript มิฉะนั้นจะส่งผลให้เกิด SyntaxError (ยกเว้นเมื่อใช้กับtypeof
)
ดังนั้นถ้าexports
มีอยู่แล้วซึ่งในกรณี Node.js (หรือในเว็บไซต์ที่เขียนไม่ดี ... ) รากจะชี้ไปมิฉะนั้นจะexports
this
แล้วอะไรthis
ล่ะ
(function() {...}).call(this);
การใช้.call
ฟังก์ชั่นจะผูกthis
ไว้ข้างในฟังก์ชั่นกับพารามิเตอร์แรกที่ผ่านไปในกรณีที่เบราว์เซอร์this
จะเป็นwindow
วัตถุในกรณีของ Node.js มันจะเป็นบริบททั่วโลกซึ่งยังเป็นglobal
วัตถุ
แต่เนื่องจากคุณมีrequire
ฟังก์ชั่นใน Node.js จึงไม่จำเป็นต้องกำหนดบางสิ่งให้กับglobal
วัตถุใน Node.js แทนคุณจึงกำหนดให้กับexports
วัตถุที่ได้รับคืนโดยrequire
ฟังก์ชัน
กาแฟสคริปต์
หลังจากคำอธิบายทั้งหมดนี่คือสิ่งที่คุณต้องทำ:
root = exports ? this
root.foo = -> 'Hello World'
สิ่งนี้จะประกาศฟังก์ชันของเราfoo
ในเนมสเปซส่วนกลาง (ไม่ว่าจะเกิดอะไรขึ้น)
นั่นคือทั้งหมดที่ :)