Mengangkat dalam Javascript === Mengkompilasi?

9

Saya menemukan perspektif yang menarik pada wawancara kerja baru-baru ini.

Mengangkat dalam Javascript adalah tentang memindahkan deklarasi variabel dan deklarasi fungsi di bagian atas skrip. Bisakah kita menyebut fase ini sebagai kompilasi ?

Saya sadar tentang fakta bahwa penerjemah Javascript memiliki 2 melewati script input di mana pada pass pertama tidak mengangkat dan pass kedua benar-benar mengeksekusi script. Setelah tahu bahwa Javascript adalah bahasa yang ditafsirkan, pertanyaan ini membuat saya sedikit bingung.

Rahul Desai
sumber

Jawaban:

18

Tidak. Mengangkat bukan kompilasi.

Hoisting adalah konsep yang dibuat oleh pengembang untuk menjelaskan apa yang terjadi selama kompilasi ketika deklarasi variabel dan fungsi dipindahkan ke bagian atas lingkupnya.

Kompilasi adalah apa yang terjadi ketika kode Javascript Anda diubah menjadi beberapa representasi lain (biasanya semacam kode yang dapat dieksekusi), yang akan dieksekusi baik sekarang atau nanti. Mesin Javascript V8 Chrome sebenarnya memiliki dua kompiler; satu untuk membuat kode yang dapat dieksekusi cepat dan kotor sekarang, yang lain untuk membuat kode yang dioptimalkan nanti.

Bahasa pemrograman tidak didefinisikan sebagai bahasa "dikompilasi" atau "ditafsirkan". Sebaliknya, bahasa ditafsirkan atau dikompilasi sesuai kebutuhan.

Bacaan Lebih Lanjut
Mengangkat dalam Javascript
Bagaimana Mesin V8 Bekerja

Robert Harvey
sumber
1
Artikel wikipedia tentang bahasa yang ditafsirkan juga membantu perbedaan "ditafsirkan" vs. "dikompilasi": en.wikipedia.org/wiki/Interpreted_language
Jika saya memahami ini dengan benar, Hoisting tidak mengubah skrip ke kode yang dapat dibaca mesin, jadi ini bukan kompilasi . Apakah saya benar? :)
Rahul Desai
Baca paragraf kedua dari jawaban saya lagi.
Robert Harvey
1
Dalam percakapan saya baru-baru ini dengan pewawancara tentang topik ini, dia memberi saya referensi ke kursus JS Advanced di FrontendMasters.com di mana Kyle Simpson menjelaskan bahwa itu adalah kompilasi, dalam arti bahwa jika kita membandingkan ini dengan skrip Bash, misalnya, itu tidak akan tahu apa yang diharapkan pada baris # 4 saat itu pada baris # 3. Namun, dalam kasus kompiler JS, ia telah melihat apa yang ada di baris # 4 sebelumnya selama pass mengangkat. Hanya saja itu tidak dikonversi menjadi kode biner tidak seperti bahasa lain. Javascript dikompilasi setiap kali dijalankan.
Rahul Desai