Karena skrip kopi tidak memiliki var
pernyataan, 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 window
objek, melainkan ada exports
objek 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 exports
didefinisikan, karena mencoba referensi variabel yang tidak ada dalam JavaScript akan menghasilkan SyntaxError (kecuali ketika digunakan dengan typeof
)
Jadi jika exports
ada, 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 .call
pada suatu fungsi akan mengikat bagian this
dalam fungsi ke parameter pertama yang dilewati, dalam hal browser this
sekarang akan menjadi window
objek, dalam kasus Node.js itu akan menjadi konteks global yang juga tersedia sebagai global
objek.
Tetapi karena Anda memiliki require
fungsi di Node.js, Anda tidak perlu menetapkan sesuatu ke global
objek di Node.js, sebagai gantinya Anda menetapkan ke exports
objek yang kemudian dikembalikan oleh require
fungsi.
Kopi-Naskah
Setelah semua penjelasan itu, inilah yang perlu Anda lakukan:
root = exports ? this
root.foo = -> 'Hello World'
Ini akan mendeklarasikan fungsi kita foo
di namespace global (apa pun yang terjadi).
Itu saja :)