JavaScript neden değişkenleri kaldırır?


94

JavaScript neden değişkenleri kaldırır?

Tasarımcıların kaldırma işlemini uygulamaya karar vermelerinin mantığı neydi? Bunu yapan başka popüler diller var mı?

Lütfen belgelere ve / veya kayıtlara ilgili bağlantıları sağlayın.


7
Bu noktada bunun tarihsel olduğundan şüpheleniyorum ve başlangıçta "uygulama kolaylığı" dışında bir şey olduğundan ciddi olarak şüpheliyim.
Dave Newton

4
Açıkçası, Brendan Eich'e sorun, oldukça duyarlı görünüyor.
Felix Kling

22
Bu soru nasıl yapıcı değil ?
Francisc

18
Eğer yaklaşık sorabilirsiniz tüm yığın taşması için @Francisc karşılama bir hareket divjQuery
Xlaudius

20
Bu gerçekten önemli bir sorudur. İzin verilmiş olmalıydı. Alev yemi değildi. Kaldırma, JavaScript'in nasıl çalıştığını anlamanın temel unsurlarından biridir ve "neden", dilin ders kitaplarının çoğunda ele alınan meşru bir sorudur. Stack Overflow çalışanlarının, insanların böyle sorularına SÜREKLİ bir şekilde ezilmeleri TAMAM DEĞİLDİR.
bearvarine

Yanıtlar:


55

Stoyan Stefanov'un "JavaScript Patterns" kitabında açıkladığı gibi, kaldırma işlemi JavaScript yorumlayıcı uygulamasının sonucudur.

JS kod yorumlaması iki geçişte gerçekleştirilir. İlk geçiş sırasında yorumlayıcı, değişken ve işlev bildirimlerini işler.

İkinci geçiş, gerçek kod yürütme adımıdır. Yorumlayıcı, işlev ifadelerini ve bildirilmemiş değişkenleri işler.

Bu nedenle, bu tür davranışları tanımlamak için "kaldırma" konseptini kullanabiliriz.


15
Ben şahsen "kaldırma" kelimesini gerçekten sevmiyorum. Değişken ve işlev bildirimlerinin sihirli bir şekilde geçerli kapsamın tepesine kaldırıldığına dair yanlış bir temsil verir, gerçekte bahsettiğiniz gibi JS yorumlayıcısı bağlamalar için kaynak kodunu tarar ve ardından kodu çalıştırır.
contactmatt

Şimdi neden JS'nin en çok yanlış anlaşılan dili anladım, bunu herhangi bir eğitimde görmedim. Ve kaldırma (ve tercüman akışı) ile karıştırıldı.
Swapnil Patwa

17
Uh, bu mantığı gerçekten açıklamıyor. Tek geçişli bir tercüman (bu, kaldırmaya neden olmazdı) çok daha basit olurdu - öyleyse tasarımcılar neden iki geçişi tercih ettiler?
Bergi

1
Bu, değişkenlerin neden özellikle yükseltildiğini açıklamıyor. Fonksiyonlar mantıklı, değişkenler anlamsız (çoğu durumda) - Bunun bir hata olduğuna inanıyorum.
Josh M.

Josh M. Bu çok kapsamlı bir şekilde belirtilmiş, bunun bir "hata" olduğunu sanmıyorum ... (Bu cevabın mantığa gerçekten cevap vermediğine katılıyorum)
Jonas Wilms

10

JS yaratıcısı Brendan Eich bir keresinde (Twitter'da) şunları söyledi :

"Bu nedenle, var kaldırma işlemi [bir] işlev kaldırma işleminin istenmeyen bir sonucuydu, blok kapsamı yok, [ve] JS 1995 acil bir işti."

Ayrıca şunu da açıkladı ...

"fonksiyon kaldırma, yukarıdan aşağıya program ayrıştırmasına izin verir, ücretsiz olarak 'izin ver', bildirmeden önce arayın; var kaldırma etiketiyle birlikte."

Brendan Eich

Bunu yapan başka popüler diller var mı?

Değişkenleri aynı şekilde yükselten başka popüler diller bilmiyorum. Flash geliştirmede kullanılan başka bir ECMAScript uygulaması olan ActionScript bile kaldırma işlemini uygulamadı. Bu, JavaScript öğrenen diğer dilleri bilen geliştiriciler için bir kafa karışıklığı ve hayal kırıklığı kaynağı olmuştur.

GÜNCELLEME: Yorumlara göre, Python benzer değişken kaldırma davranışına sahiptir .


2
Soruyu doğrudan ele almaya çalışan tek cevap bu olduğu için +1 vermek.
Damon

1
Bu cevap için teşekkür ederim. @ Damon'a tamamen katılıyorum!
codingbryan

1
Değişken kaldırmaya sahip diğer bir popüler dil ise Python: stackoverflow.com/q/63337235/2326961
Maggyero

2

Bunun nedeni, javascript yorumlayıcısının kodu iki döngüde yorumlamasıdır.

  1. Kod tamamlama / derleme:
  2. Kod yürütme:

1 döngüsünde tüm değişken ve fonksiyon tanımlamaları bunun yürütülüyor fonksiyon kapsamı üstüne alınır. Bu yaratmada yardımcı olur variableObjectsyönelik execution contextbile 's çalıştırılmadan önce işlevin.

2. aşamada, değer atamaları, kod ifadeleri ve işlev çağrıları beklenen şekilde satır satır gerçekleşir.

Burada biraz daha detaylı okuyabilirsiniz .

Size davranış, etrafımızda etrafında daha iyi bir görüntü verecektir let, constve classbildirimleri, bu değişken ve fonksiyonlar arasında şu da öncelik.


1
Bunun bir tasarım seçiminin bir sonucu olduğunu mu ima ediyorsunuz? Eğer öyleyse, cevabınızda açıkça belirtmelisiniz. Ancak Brendan Eich'in cevabını okumak, aranan bir özellik olabilir, son cümleyi nasıl yorumladığına bağlı. Sonuç olarak, neden kesin olarak bilmiyorum
Bombinosh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.