3.Type berasal dari JavaScript dan termasuk dalam JavaScript.
Mengapasebenarnya
, tidak peduli apakah JavaScript yang kita tulis diserahkan ke browser Atau eksekusi Node, pada akhirnya harus dieksekusi oleh CPU, jadi kita memerlukan mesin JavaScript untuk membantu kita menerjemahkan kode JavaScript ke dalam instruksi CPU untuk mengeksekusi
Di sini kita mengambil WebKit sebagai kolom.
WebCore: Bertanggung jawab atas penguraian HTML, tata letak, rendering, dan pekerjaan terkait lainnya
kode JavaScript
dan merekamobjek variabel VO (Variable Object) dalam standar ECMA terbaru, VO sudah memiliki nama lain untuk variabel lingkungan VE
GO (Clobal Object) objek global dan konteks eksekusi global
AO (Activation Objece). ). ) mencakup
JavaScript akan mengalokasikan memori untuk kita saat mendefinisikan variabel
JS mengalokasikan memori untuk tipe data dasar langsung di ruang tumpukan selama eksekusi;
Alokasi memori JS untuk tipe data kompleks akan membuka ruang di memori heap, dan merujuk ke variabel nilai kembalian penunjuk dari
karena ukuran memori terbatas , jadi ketika memori tidak lagi diperlukan, kami perlu merilisnya untuk mengosongkan lebih banyak ruang memori.
Pengumpulan sampah dalam bahasa Inggris adalah Garbage Collection atau GC.
Untuk objek yang tidak lagi digunakan, kami menyebutnya sampah. Objek tersebut perlu didaur ulang untuk melepaskan lebih banyak ruang memori. Lingkungan runtime bahasa kami, seperti lingkungan runtime Java JVM, dan mesin js lingkungan runtime JavaScript, akan Pengumpul sampah memori, pengumpul sampah, kami juga menyebutnya GC, jadi di banyak tempat Anda melihat bahwa GC sebenarnya mengacu pada pengumpul sampah.
adalah definisi penutupan dalam ilmu komputer (Wikipedia):
Penutupan (Bahasa Inggris: Closure), disebut juga penutupan leksikal (Lexical Closure) atau penutupan fungsi (function closes);
Ini adalah teknologi yang mengimplementasikan pengikatan leksikal dalam bahasa pemrograman yang mendukung fungsi kelas satu;
Dalam implementasinya, penutupan adalah struktur yang menyimpan fungsi dan lingkungan terkait (setara dengan tabel pencarian simbol);
Perbedaan terbesar antara penutupan dan fungsi adalah ketika penutupan ditangkap, variabel bebasnya akan ditentukan pada saat pengambilan, sehingga dapat berjalan seperti biasa meskipun berada di luar konteks pada saat
pengambilan konsep penutupan muncul pada tahun 1960an. Program paling awal yang mengimplementasikan penutupan adalah Skema, sehingga kita dapat memahami mengapa ada penutupan di JavaScript;
Karena banyak desain di JavaScript yang berasal dari Skema;
Mari kita lihat penjelasan MDN tentang penutupan JavaScript:
Suatu fungsi dibundel dengan referensi ke keadaan sekitarnya (lingkungan leksikal) (atau fungsi tersebut dikelilingi oleh referensi). dari fungsi luarnya;
Dalam JavaScript, setiap kali suatu fungsi dibuat, penutupan akan dibuat bersamaan dengan pembuatan fungsi;
function foo() { var nama = 'mengapa' var usia = 18 bilah fungsi() { console.log('bar',nama) } return bar}var fun = foo()fun()
Ringkasan:
Fungsi fungsi biasa adalah penutupan jika ia dapat mengakses variabel bebas yang ditindaklanjuti oleh lapisan luar;
Dari perspektif luas: fungsi dalam JavaScript adalah penutupan;
Dari sudut pandang sempit: jika suatu fungsi di JavaScript mengakses variabel luar, maka ini adalah
;
Peramban: jendela
Lingkungan node: {}
Fungsi panah adalah metode penulisan fungsi yang ditambahkan setelah ES6, dan lebih ringkas daripada ekspresi fungsi;
Fungsi panah tidak akan mengikat atribut this dan argumen;
Fungsi
panah tidak dapat digunakan sebagai konstruktor (tidak dapat digunakan dengan yang baru, kesalahan akan muncul).
argumen argumen adalah array (semu) (seperti array) yang sesuai dengan parameter yang diteruskan ke fungsi
Ada konsep yang sangat penting dalam pemrograman fungsional yang disebut fungsi murni. JavaScript sesuai dengan spesifikasi pemrograman fungsional, jadi ada juga konsep fungsi murni
di Wikipedia:
Dalam pemrograman, jika suatu fungsi memenuhi syarat berikut, maka fungsi ini disebut fungsi murni. Jika fungsi tersebut memiliki nilai masukan yang sama, maka perlu menghasilkan keluaran yang sama. Keluaran dari fungsi tersebut tidak ada hubungannya dengan informasi tersembunyi lainnya atau keadaan selain nilai input. Fungsi yang tidak terkait dengan output eksternal yang dihasilkan oleh perangkat I/O tidak dapat memiliki efek samping fungsi yang dapat diamati secara semantik, seperti "memicu peristiwa", menyebabkan perangkat output mengeluarkan output, atau mengubah konten objek selain nilai output. . Ringkasan:
Masukan yang ditentukan harus menghasilkan keluaran tertentu;
Selama pelaksanaan suatu fungsi, tidak ada efek samping yang dapat terjadi
:
Currying juga merupakan konsep yang sangat penting dalam pemrograman fungsional yang dijelaskan Wikipedia:
Dalam ilmu komputer, Currying (Currying), juga diterjemahkan sebagai Currying atau Currying, adalah fungsi yang menerima banyak parameter, menjadi fungsi yang menerima parameter tunggal (parameter pertama dari fungsi asli), dan mengembalikan fungsi baru yang menerima argumen yang tersisa dan mengembalikan hasil Klaim kari: Jika Anda memperbaiki argumen tertentu, Anda akan mendapatkan
ringkasan fungsi yang menerima argumen yang tersisa:
Berikan hanya sebagian parameter ke fungsi untuk memanggilnya, dan biarkan fungsi tersebut mengembalikan area fungsi untuk memproses parameter yang tersisa;
Proses ini disebut kari.
Mengapa kari diperlukan:
Dalam pemrograman fungsional, kita sering berharap bahwa masalah yang ditangani oleh suatu fungsi sesederhana mungkin, daripada menyerahkan banyak pemrosesan ke suatu fungsi untuk menangani
function foo(x,y,c) { kembalikan x + y + c } konsol.log(foo(10,20,30)) //Fungsi kari jumlah(x) { fungsi pengembalian(y) { fungsi pengembalian(z) { kembalikan x + y + z } } } var a = jumlah(10)(20)(30) konsol.log(a) //Sederhanakan kari var sum2 = x => y => z => { kembalikan x + y + z } console.log(sum2(10)(20)(30))Fungsi
(Tulis) adalah teknik dan mode untuk menggunakan fungsi dalam pengembangan JavaScript:
Misalnya, kita sekarang perlu memanggil suatu fungsi pada data tertentu dan menjalankan dua fungsi fn1 dan fn2. Kedua fungsi ini dijalankan secara berurutan. Jika kita perlu memanggil dua fungsi setiap kali, operasi tersebut akan muncul berulang-ulang untuk menggabungkan kedua fungsi ini dan memanggilnya satu demi satu secara otomatis?
Proses ini merupakan penggabungan fungsi-fungsi yang kita sebut Fungsi Compose.
dengan pernyataan
+Fungsi: Anda dapat membentuk cakupan Anda sendiri. Tidak disarankan untuk menggunakan pernyataan with karena mungkin menjadi sumber kesalahan kebingungan dan masalah
kompatibilitas '} // var pesan = "halo dunia" fungsi foo() { bilah fungsi () { dengan (obj2) { console.log(pesan) } } batang() } foo()
eval adalah fungsi khusus yang dapat menjalankan string masuk sebagai kode JavaScript
var strFn = 'var message = "Hello world"; console.log(message);'; eval(strFn)
Tidak disarankan menggunakan eval dalam pengembangan:
Keterbacaan kode eval sangat buruk (keterbacaan kode adalah prinsip penting dari kode berkualitas tinggi);
eval adalah sebuah string, sehingga dapat dirusak selama eksekusi, yang dapat menyebabkan risiko diserang;
Eksekusi eval harus melalui penerjemah JS dan harus dioptimalkan oleh mesin JS
adalah mode JavaScript yang membatasi, yang membuat kode secara implisit melepaskan diri dari "mode ceroboh" Ketika browser yang mendukung mode ketat mendeteksi mode ketat dalam kode, mereka akan memantau dan mengeksekusi kode dengan cara yang lebih ketat. Mode ketat akan menghilangkan beberapa kesalahan diam asli dengan melemparkan kesalahan ketika mengeksekusi kode secara berkala (tidak perlu berurusan dengan sintaks khusus)
"use strict"; // Aktifkan mode ketat var message = "hello world" console.log(message)
pembatasan mode ketat <br/ > Di sini kita membicarakan beberapa hal pembatasan sintaksis yang ketat dalam mode ketat:
JavaScript dirancang untuk memudahkan pengembang pemula untuk memulai, jadi terkadang sintaksis yang salah dianggap diuraikan secara normal. Namun, dalam mode ketat, kesalahan tersebut akan dianggap sebagai kesalahan sehingga
// 1. Secara tidak sengaja membuat variabel global message = "Halo dunia" console.log(pesan) fungsi foo() { umur = 20 } foo()Mode ketat
Console.log(age)
//Kesalahan statis default true.name ='xiaoluo'; NaN = 123
// Parameter fungsi tidak diperbolehkan memiliki nama yang sama function foo(x,y,x) { console.log(x,y,x)}foo(10,20,30)
var num = 0o123 // Oktal var num2 = 0x123 // Heksadesimal console.log(num,num2)
var obj2 = {name:'Tom',age:18,message:'obj2'}tidak diperbolehkan
dengan (obj2) { console.log(pesan) }
var untuk lapisan atas strFn = 'var message = "Hello world"; evaluasi(strFn)Dalam mode ketat
console.log(message)
fungsi yang tidak ditentukan foo() { console.log(ini) //tidak terdefinisi } foo()