1. Ruang memori di JS dibagi menjadi dua jenis: menumpuk memori dan memori tumpukan
Stack Memory: Menyediakan lingkungan untuk eksekusi kode JS; menyimpan nilai -nilai tipe data dasar; -> ruang lingkup global atau ruang lingkup pribadi sebenarnya adalah memori tumpukan
Heap Memory: Menyimpan nilai tipe data referensi (objek menyimpan nama atribut dan nilai atribut di dalamnya, dan fungsi menyimpan kode dalam badan fungsi sebagai string)
2. Saat browser memuat halaman HTML kami, pertama -tama akan menyediakan lingkungan untuk eksekusi kode JS -> lingkup global (global-> window)
3. Sebelum kode JS dieksekusi, browser perlu melakukan beberapa hal dengan sendirinya: mendeklarasikan atau mendefinisikan semua kata kunci var/fungsi terlebih dahulu -> "pra -eksplanasi" (suara variabel)
Menyatakan -> beri tahu browser bahwa saya memiliki hal seperti itu, seperti var num1; fungsi fn;
Didefinisikan -> menetapkan nilai ke variabel atau fungsi yang dinyatakan, misalnya num1 = 12; fn = function () {}
Variabel [penting] hanya menyatakan bahwa mereka tidak didefinisikan, nilai default tidak ditentukan (tidak ditentukan)
4. Pemrosesan VAR dan fungsi berbeda pada tahap pra-interpretasi.
var -> Ketika pra -eksplanasi dilakukan, variabel dinyatakan sebelumnya. Operasi penugasan akan diselesaikan hanya ketika kode dieksekusi.
Fungsi -> Selama pra -eksplanasi, semua deklarasi dan definisi akan diselesaikan sebelumnya (ketika kode dieksekusi, itu akan dilewati secara langsung)
[Penting] Pada awalnya, hanya pra-interpretasi yang dilakukan di jendela. String saat ini yang disimpan dalam fungsi FN adalah semua string, jadi VAR Total tidak memiliki makna praktis, sehingga pra-interpretasi tidak dilakukan-> "Pra-interpretasi terjadi dalam ruang lingkup saat ini"
console.log (obj); //-> var obj = {name: "zhang shanshan", usia: 10}; fungsi fn (num1, num2) {// lewati langsung ketika kode dieksekusi ke baris ini, karena selama pra-eksplanasi kami telah menyelesaikan deklarasi dan definisi var total = num1 + num2; console.log (total); } var num1 = 12; fn (num1, 100); // jalankan fn, tetapkan nilai variabel global num1 ke parameter num1, dan tetapkan 100 ke parameter num25. Variabel yang dinyatakan di bawah lingkup global adalah variabel global
Variabel yang dinyatakan dalam ruang lingkup pribadi adalah variabel pribadi; Parameter formal fungsi juga merupakan variabel pribadi;
Bagaimana cara mengetahui apakah variabel yang muncul dalam suatu fungsi bersifat pribadi atau global?
Pertama, lihat apakah itu adalah parameter formal, dan kemudian lihat apakah telah dinyatakan dalam ruang lingkup pribadi (memiliki vared). Salah satu dari keduanya adalah variabel pribadi. Kemudian di mana pun itu muncul dalam fungsi saat ini, itu pribadi, dan tidak ada hubungan antara itu dan yang global; Jika juga tidak, itu berarti itu tidak pribadi, maka cari ruang lingkup sebelumnya ...
6. Ketika fungsi dieksekusi, ruang lingkup pribadi baru (memori stack) akan dibentuk untuk kode dalam badan fungsi untuk dieksekusi;
1) Tetapkan nilai ke parameter formal
2) Pra-interpretasi di bawah cakupan pribadi
3) Eksekusi kode di bawah cakupan pribadi
Ruang lingkup pribadi baru yang dibentuk juga melindungi variabel pribadi di dalam dari pengaruh eksternal. Kami menempatkan mekanisme perlindungan fungsi ini -> "Penutupan
Perbedaan: Mereka yang memiliki VAR dapat dinyatakan sebelum kode dieksekusi, sedangkan yang tanpa VAR tidak dapat dinyatakan sebelumnya
1. Pra-penjelasan diperlukan terlepas dari apakah kondisinya benar atau tidak.
Window Pre-Eksplanasi: Var A; -> window.a; if (! ("a" di jendela)) {// "a" di jendela -> true var a = "us"; } console.log (a); //-> tidak terdefinisi2. Pra-interpretasi hanya terjadi di sisi kiri "=", hanya sisi kiri yang pra-interpretasi, dan sisi kanan adalah nilai tanpa pra-interpretasi.
Ekspresi fungsi fungsi anonim: Tetapkan bagian dari definisi fungsi sebagai nilai untuk peristiwa yang merupakan variabel atau elemen.
Ketika pra-eksplanasi: var fn; -> Nilai default FN tidak ditentukan
fn (); //-> undefined () TypeError Uncaught: fn bukan fungsi hanya fungsi yang dapat dieksekusi dalam js && jika kode di atas di atas JS dilaporkan, kode di bawah ini tidak dieksekusi tanpa pemrosesan khusus var fn = function () {console.log ("OK"); }; fn (); Ketika pra-eksplanasi: fn = xxxfff000 fn (); //-> "ok" fungsi fn () {console.log ("ok"); } fn (); //-> "ok" fungsi fn () {console.log ("ok"); } fn (); //-> "ok"3. Kode di bawah pengembalian dalam badan fungsi tidak lagi dieksekusi, tetapi kode di bawah ini perlu berpartisipasi dalam pra-penjelasan; Dan hal-hal di balik pengembalian perlu diproses, tetapi karena dikembalikan sebagai nilai, pra-penjelasan tidak dilakukan;
var total = 300; fungsi fn () {console.log (total); return function sum () {}; // return adalah mengembalikan nilai dalam fungsi ke luar fungsi, yang mengembalikan alamat memori yang sesuai dengan fungsi ke luar fungsi, misalnya: return xxxfff111; Kode di bawah pengembalian dalam badan fungsi tidak mengeksekusi var total = 10; } fn ();4. Fungsi fungsi anonim tidak dijelaskan sebelumnya di bawah ruang lingkup global.
Fungsi yang dieksekusi sendiri dari fungsi anonim: Definisi dan eksekusi diselesaikan bersama
(function (num) {}) (100);
5. Ketika pra-eksplanasi, jika nama diulang, itu hanya akan dinyatakan sekali dan tidak diulang, tetapi penugasan masih akan diulang.
Jika nama variabel dan nama fungsi sama dengan nama fungsi dalam JS, itu dianggap diulangi
Pra-Eksplanasi:
var fn; mendeklarasikan fn = xxxfff000; [Deklarasi] Jangan + tentukan fn = xxxfff111; [Deklarasi] jangan + definisi -> fn = xxxfff111 var fn = 12; // window.fn = 12 function fn () {//window.fn=Function () {}} function fn () {}Di atas adalah semua pemahaman yang relevan tentang JS pra-penjelasan yang dibawa kepada Anda oleh editor. Saya harap Anda akan mendukung wulin.com lebih banyak ~