Persoalan yang timbul semasa mempelajari kaedah penulisan modular js, kodnya adalah seperti berikut
// 立即执行函数写法,保证外部不能访问到 count
var module1 = (function() {
var count = 0;
var m1 = function() {
return count;
};
return {
m1: m1
};
})();
// 如果现在想给 module1 添加新的方法
module1 = (function(mod) {
mod.m2 = function() {
return count;
}
return mod;
})(module1);
console.log(module1.m1());//可以访问到 count
// console.log(module1.m2());
Saya tertanya-tanya kenapa module1.m2()
访问不到 count
?
Petunjuk: Sebab mengapa m1 boleh mengakses kiraan adalah kerana m1 dan kiraan diisytiharkan dalam fungsi yang sama, iaitu, mereka berada dalam skop yang sama, tetapi fungsi di mana m2 terletak tidak dalam fungsi yang sama seperti di bawah skopnya, tiada hubungan antara fungsi yang tertanam dalam fungsi, jadi secara semula jadi ia tidak boleh diakses.
Penyoal berpendapat bahawa modul1 itu sendiri berada di bawah fungsi yang sama dengan kiraan, jadi dia menambah kaedah kepada modul1 Kaedah ini berada di bawah skop yang sama dengan kiraan?
Oleh kerana skop leksikal, fungsi JS mempunyai skop statik, yang bermaksud bahawa apabila fungsi ditakrifkan, ia telah ditentukan simbol pembolehubah di dalamnya apabila anda mentakrifkan m1 secara dalaman, fungsi tanpa nama mengembalikan kiraan ini akan ditentukan untuk berada di luar fungsi ini apabila ia ditakrifkan
var count=0
.Apabila anda mentakrifkan m2, fungsi tanpa nama mengembalikan kiraan Carian simbol untuk kiraan ini adalah untuk terlebih dahulu menyemak sama ada ia berada di dalam tempat yang ditakrifkan, kemudian semak tempat di mana fungsi lapisan atas ditakrifkan, dan maka tempat paling luar Ia adalah pembolehubah global, jadi kiraan di sini adalah pembolehubah global.
Jadi module1.m2() tidak boleh mengakses pembolehubah kiraan yang anda takrifkan pada m1 Kerana skop leksikal statik, m2 tidak dapat menjejakinya.