Vì tập lệnh cà phê không có var
câ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 exports
tồ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à this
sao
(function() {...}).call(this);
Sử dụng .call
trên một hàm sẽ liên kết this
bên trong hàm với tham số đầu tiên được truyền, trong trường hợp trình duyệt this
bâ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ó require
hà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 foo
trong không gian tên toàn cầu (bất cứ điều gì xảy ra).
Đó là tất cả :)