Vì tập lệnh cà phê không có varcâu lệnh, nó sẽ tự động chèn nó cho tất cả các biến trong tập lệnh cà phê, theo cách đó nó ngăn phiên bản JavaScript được biên dịch rò rỉ mọi thứ vào không gian tên toàn cục .
Vì vậy, vì không có cách nào để làm cho một cái gì đó "rò rỉ" vào không gian tên toàn cầu từ phía kịch bản cà phê của những thứ có chủ đích, bạn cần xác định các biến toàn cục của mình là thuộc tính của đối tượng toàn cầu .
đính kèm chúng như các thuộc tính trên cửa sổ
Điều này có nghĩa là bạn cần phải làm một cái gì đó như window.foo = 'baz';, xử lý trường hợp trình duyệt, vì có đối tượng toàn cầu là window.
Node.js
Trong Node.js không có windowđối tượng, thay vào đó, có exportsđối tượng được chuyển vào trình bao bọc bọc mô-đun Node.js (Xem: https://github.com/ry/node/blob/master/src/node.js# L321 ), vì vậy trong Node.js, điều bạn cần làm là exports.foo = 'baz';.
Bây giờ chúng ta hãy xem những gì nó nêu trong trích dẫn của bạn từ các tài liệu:
... nhắm mục tiêu cả CommonJS và trình duyệt: root = export? điều này
Đây rõ ràng là kịch bản cà phê, vì vậy chúng ta hãy xem những gì nó thực sự biên dịch thành:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Đầu tiên, nó sẽ kiểm tra xem có exportsđược xác định hay không, vì cố gắng tham chiếu một biến không tồn tại trong JavaScript sẽ mang lại một SyntaxError (trừ khi nó được sử dụng với typeof)
Vì vậy, nếu exportstồn tại, đó là trường hợp trong Node.js (hoặc trong một WebSite được viết xấu ...) sẽ chỉ đến exports, nếu không thì this. Vậy là thissao
(function() {...}).call(this);
Sử dụng .calltrên một hàm sẽ liên kết thisbên trong hàm với tham số đầu tiên được truyền, trong trường hợp trình duyệt thisbây giờ sẽ là windowđối tượng, trong trường hợp Node.js, đó sẽ là bối cảnh toàn cầu cũng có sẵn dưới dạng globalđối tượng.
Nhưng vì bạn có requirehàm trong Node.js, nên không cần gán một cái gì đó cho globalđối tượng trong Node.js, thay vào đó bạn gán cho exportsđối tượng mà sau đó được hàm trả về require.
Cà phê-Script
Sau tất cả những lời giải thích đó, đây là những gì bạn cần làm:
root = exports ? this
root.foo = -> 'Hello World'
Điều này sẽ khai báo chức năng của chúng ta footrong không gian tên toàn cầu (bất cứ điều gì xảy ra).
Đó là tất cả :)