+function foo(){
foo=10;//我的问题代码
console.log(foo);//方法自己
}();
console.log(typeof foo);//undefined 观察是否全局污染
Saya ingin bertanya ke mana perginya 10 yang ditetapkan semula kepada foo di dalam fungsi foo, dan bagaimana fungsi foo dengan nama yang sama menghalang pencemaran global Sila selesaikan dan kembangkannya
Penyoal boleh bertanya ini, tidak mengapa. Namun, masalah ini boleh diselesaikan melalui amalan. . .
Pertama sekali, penyoal tidak mempunyai masalah dengan cara menulis IIFE Terdapat banyak cara untuk menulis IIFE Yang paling biasa ialah apa yang @ewind katakan dan:
.Ada juga yang jarang berlaku:
Kemudian mari kita bercakap tentang kod:
Apabila memberikan nilai kepada nama fungsi semasa dalam fungsi:
foo = 10;
Tidak sah. (Saya bersetuju dengan @ewind, ia akan diabaikan di sini, perlu ada penjelasan yang lebih munasabah.) Penghurai JS akan mengabaikannya.hasil yang saya laksanakan dalam konsol Chrome ialah:
Ini membuktikan apa yang saya katakan di atasabaikan.
Kemudian kerana IIFE mensimulasikan skop blok, persekitaran luaran tidak boleh mengakses pembolehubah dalaman. Jadi ia tidak ditentukan.
@ewind berkata demikian kerana foo ialah fungsi tanpa nama, jadi apa?
Jelas sekali konsepnya keliru. Fungsi foo bukan fungsi tanpa nama.
MDN
Pertama sekali, kod yang disiarkan tidak lengkap. Versi penuh sepatutnya seperti ini
Ini nampaknya berlawanan dengan intuitif, kerana foo yang diisytiharkan tanpa var tidak mencemarkan skop global.
Tetapi jika nama pembolehubah yang diisytiharkan dalam fungsi itu bukan foo, ia sangat intuitif, seperti berikut:
Jadi mengapa masalah berlaku apabila pembolehubah yang diisytiharkan dalam fungsi mempunyai nama yang sama dengan nama fungsi? Anda boleh lihat contoh ini:
Selepas fungsi yang dilaksanakan serta-merta mempunyai nama fungsi foo, arguments.callee semasa memanggil sebenarnya merujuk kepada foo. Membandingkan kedua-duanya, kita dapati bahawa foo ialah objek fungsi pada masa ini. Pada masa ini, operasi penugasan tidak akan berkuat kuasa Apabila menemui pembolehubah foo tanpa perisytiharan var, penterjemah juga akan mencari objek fungsi ini, sekali gus menghalang pencemaran dalam skop global.