Karena skrip kopi tidak memiliki varpernyataan, skrip kopi secara otomatis memasukkannya ke semua variabel dalam skrip kopi, sehingga mencegah versi JavaScript yang dikompilasi dari membocorkan semuanya ke namespace global .
Jadi karena tidak ada cara untuk membuat sesuatu "bocor" ke ruang nama global dari sisi naskah kopi hal-hal yang disengaja, Anda perlu mendefinisikan variabel global Anda sebagai properti dari objek global .
lampirkan sebagai properti di jendela
Ini berarti Anda perlu melakukan sesuatu seperti window.foo = 'baz';, yang menangani kasus browser, karena di sana objek global adalah window.
Node.js
Di Node.js tidak ada windowobjek, melainkan ada exportsobjek yang dilewatkan ke pembungkus yang membungkus modul Node.js (Lihat: https://github.com/ry/node/blob/master/src/node.js# L321 ), jadi di Node.js apa yang perlu Anda lakukan adalah exports.foo = 'baz';.
Sekarang mari kita lihat apa yang tercantum dalam kutipan Anda dari dokumen:
... menargetkan CommonJS dan browser: root = ekspor? ini
Ini jelas skrip kopi, jadi mari kita lihat apa yang sebenarnya dikompilasi:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Pertama akan memeriksa apakah exportsdidefinisikan, karena mencoba referensi variabel yang tidak ada dalam JavaScript akan menghasilkan SyntaxError (kecuali ketika digunakan dengan typeof)
Jadi jika exportsada, yang merupakan kasus di Node.js (atau dalam WebSite yang ditulis dengan buruk ...) root akan menunjuk ke exports, sebaliknya this. Jadi apa this?
(function() {...}).call(this);
Menggunakan .callpada suatu fungsi akan mengikat bagian thisdalam fungsi ke parameter pertama yang dilewati, dalam hal browser thissekarang akan menjadi windowobjek, dalam kasus Node.js itu akan menjadi konteks global yang juga tersedia sebagai globalobjek.
Tetapi karena Anda memiliki requirefungsi di Node.js, Anda tidak perlu menetapkan sesuatu ke globalobjek di Node.js, sebagai gantinya Anda menetapkan ke exportsobjek yang kemudian dikembalikan oleh requirefungsi.
Kopi-Naskah
Setelah semua penjelasan itu, inilah yang perlu Anda lakukan:
root = exports ? this
root.foo = -> 'Hello World'
Ini akan mendeklarasikan fungsi kita foodi namespace global (apa pun yang terjadi).
Itu saja :)