Masalah dengan mencoba mencari tahu di lingkungan mana kode Anda berjalan adalah bahwa objek apa pun dapat dimodifikasi dan dideklarasikan sehingga hampir mustahil untuk mengetahui objek mana yang asli dari lingkungan, dan yang telah dimodifikasi oleh program.
Namun, ada beberapa trik yang dapat kita gunakan untuk mencari tahu dengan pasti di lingkungan mana Anda berada.
Mari kita mulai dengan solusi yang diterima secara umum yang digunakan di perpustakaan garis bawah:
typeof module !== 'undefined' && module.exports
Teknik ini sebenarnya sangat baik untuk sisi server, seperti ketika require
fungsi dipanggil, itu me-reset this
objek ke objek kosong, dan mendefinisikan kembali module
untuk Anda lagi, yang berarti Anda tidak perlu khawatir tentang gangguan luar. Selama kode Anda dimuat require
, Anda aman.
Namun, ini berantakan di browser, karena siapa pun dapat dengan mudah menentukan module
untuk membuatnya tampak seperti objek yang Anda cari. Di satu sisi ini mungkin perilaku yang Anda inginkan, tetapi juga menentukan variabel apa yang pengguna perpustakaan dapat gunakan dalam lingkup global. Mungkin seseorang ingin menggunakan variabel dengan nama module
yang ada exports
di dalamnya untuk penggunaan lain. Itu tidak mungkin, tetapi siapa kita untuk menilai variabel apa yang bisa digunakan orang lain, hanya karena lingkungan lain menggunakan nama variabel itu?
Kuncinya adalah, jika kita mengasumsikan bahwa skrip Anda sedang dimuat dalam lingkup global (yang akan menjadi itu jika dimuat melalui tag skrip) variabel tidak dapat dicadangkan dalam penutupan luar, karena browser tidak mengizinkan itu . Sekarang ingat dalam simpul, this
objek adalah objek kosong, namun module
variabel masih tersedia. Itu karena itu dinyatakan dalam penutupan luar. Jadi kita dapat memperbaiki cek garis bawah dengan menambahkan cek tambahan:
this.module !== module
Dengan ini, jika seseorang menyatakan module
dalam lingkup global di browser, itu akan ditempatkan di this
objek, yang akan menyebabkan tes gagal, karena this.module
, akan menjadi objek yang sama dengan modul. Pada simpul, this.module
tidak ada, dan module
ada dalam penutupan luar, sehingga tes akan berhasil, karena mereka tidak setara.
Dengan demikian, tes terakhir adalah:
typeof module !== 'undefined' && this.module !== module
Catatan: Meskipun ini sekarang memungkinkan module
variabel untuk digunakan secara bebas di lingkup global, masih dimungkinkan untuk memotong ini di browser dengan membuat penutupan baru dan menyatakan di module
dalamnya, kemudian memuat skrip dalam penutupan itu. Pada saat itu pengguna sepenuhnya mereplikasi lingkungan simpul dan mudah-mudahan tahu apa yang mereka lakukan dan sedang mencoba melakukan gaya simpul yang diperlukan. Jika kode ini disebut dalam tag skrip, kode itu masih aman dari penutupan luar baru.