Mengapa variabel kerekan JavaScript?

95

Mengapa variabel kerekan JavaScript?

Apa alasan para desainer ketika mereka memutuskan untuk menerapkan hoisting? Apakah ada bahasa populer lain yang melakukan ini?

Harap berikan tautan yang relevan ke dokumentasi dan / atau catatan.

Xlaudius
sumber
7
Saya menduga pada titik ini itu historis, dan saya benar-benar meragukan itu adalah apa pun selain "kemudahan implementasi" pada awalnya.
Dave Newton
4
Jujur saja, tanya Brendan Eich, dia sepertinya cukup responsif.
Felix Kling
23
Bagaimana pertanyaan ini tidak konstruktif?
Francisc
19
@Francisc selamat datang di Stack Overflow, di mana semua yang dapat Anda tanyakan adalah memindahkan divdi jQuery
Xlaudius
21
Ini adalah pertanyaan yang sangat penting. Seharusnya diizinkan. Itu bukan umpan api. Hoisting adalah salah satu elemen inti untuk memahami cara kerja JavaScript, dan "mengapa" adalah pertanyaan yang sah yang dibahas di sebagian besar perawatan bahasa di buku teks. TIDAK BOLEH orang Stack Overflow TERUS menginjak-injak pertanyaan orang seperti ini.
bearvarine

Jawaban:

55

Seperti yang dijelaskan Stoyan Stefanov dalam buku "Pola JavaScript", pengangkatan tersebut merupakan hasil dari penerapan penerjemah JavaScript.

Interpretasi kode JS dilakukan dalam dua lintasan. Selama lintasan pertama, interpreter memproses deklarasi variabel dan fungsi.

Pass kedua adalah langkah eksekusi kode yang sebenarnya. Penerjemah memproses ekspresi fungsi dan variabel yang tidak dideklarasikan.

Jadi, kita dapat menggunakan konsep "mengangkat" untuk menggambarkan perilaku tersebut.

lxgreen
sumber
15
Saya pribadi sangat tidak suka dengan kata "mengangkat". Ini memberikan representasi palsu bahwa deklarasi variabel dan fungsi secara ajaib diangkat ke atas cakupan saat ini, ketika pada kenyataannya, interpreter JS, seperti yang Anda sebutkan, memindai kode sumber untuk binding dan kemudian mengeksekusi kode tersebut.
contactmatt
Sekarang saya mengerti mengapa bahasa JS paling disalahpahami, saya tidak melihat ini di tutorial manapun. Dan bingung dengan hoisting (dan aliran interepreter).
Swapnil Patwa
18
Uh, ini tidak menjelaskan alasannya. Penerjemah single-pass (yang tidak akan menyebabkan pengangkatan) akan jauh lebih sederhana - jadi mengapa desainer memilih dua pass?
Bergi
1
Ini tidak menjelaskan mengapa variabel, secara khusus dikibarkan. Fungsi masuk akal, variabel tidak (dalam banyak kasus) - Saya yakin ini bug.
Josh M.
1
Josh M. Ini sangat spesifik, saya tidak berpikir bahwa ini adalah "bug" ... (saya setuju bahwa jawaban ini tidak benar-benar menjawab alasannya)
Jonas Wilms
11

Pencipta JS Brendan Eich pernah berkata (di Twitter) :

"var hoisting dengan demikian [sebuah] konsekuensi yang tidak diinginkan dari fungsi mengangkat, tidak ada lingkup blok, [dan] JS sebagai pekerjaan terburu-buru 1995."

Dia juga menjelaskan bahwa…

"function hoisting memungkinkan dekomposisi program dari atas ke bawah, 'let rec' gratis, panggil sebelum mendeklarasikan; var hoisting dengan tag bersama."

Brendan Eich

Apakah ada bahasa populer lain yang melakukan ini?

Saya tidak tahu bahasa populer lainnya yang mengangkat variabel dengan cara yang sama. Saya pikir bahkan ActionScript - implementasi lain dari ECMAScript yang digunakan dalam pengembangan Flash - tidak menerapkan pengangkatan. Ini telah menjadi sumber kebingungan dan frustrasi bagi pengembang yang terbiasa dengan bahasa lain yang mempelajari JavaScript.

PEMBARUAN: Dari komentar, Python memiliki perilaku mengangkat variabel yang serupa .

gfullam.dll
sumber
2
Memberikan +1 karena ini adalah satu-satunya jawaban yang mencoba menjawab pertanyaan secara langsung.
Damon
1
Terima kasih atas jawaban ini. Saya setuju sepenuhnya dengan @Damon!
codingbryan
1
Bahasa populer lainnya yang memiliki pengangkat variabel adalah Python: stackoverflow.com/q/63337235/2326961
Maggyero
2

Ini karena juru bahasa javascript menafsirkan kode dalam dua siklus.

  1. Penyelesaian / kompilasi kode:
  2. Eksekusi kode:

Dalam siklus 1 semua variabel dan fungsi deklarasi dibawa ke atas ruang lingkup fungsi itu mengeksekusi dalam. Hal ini membantu dalam menciptakan variableObjectsuntuk execution contextfungsi bahkan sebelum eksekusi itu.

Pada fase ke-2, penetapan nilai, pernyataan kode, dan pemanggilan fungsi dilakukan baris demi baris dengan cara yang diharapkan.

Anda memiliki bacaan lebih rinci di sini.

Ini akan memberi Anda gambaran yang lebih baik seputar perilaku di sekitar let, constdan classdeklarasi, juga prioritas berikut antara variabel dan fungsi.

Jaspreet Singh
sumber
1
Apakah Anda menyiratkan bahwa ini adalah konsekuensi dari pilihan desain? Jika ya, Anda harus menyatakannya dengan jelas dalam jawaban Anda. Tetapi membaca jawaban Brendan Eich, itu mungkin fitur yang diinginkan, itu tergantung bagaimana Anda menafsirkan kalimat terakhir. Intinya, saya masih belum tahu kenapa pasti
Bombinosh