Sonuçlar neden küme ayracı yerleşimine göre değişiyor?


119

Bu makaleden alınan aşağıdaki kod parçacıkları neden küme parantezlerinin yerleşimindeki tek bir değişiklik nedeniyle farklı sonuçlar veriyor?

Açılış küme ayracı {yeni bir satırdayken, test()döner undefinedve uyarıda "hayır - kırıldı: tanımsız" görüntülenir.

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

Küme ayracı ile aynı satırda olduğunda return, test()bir nesne döndürür ve "harika" uyarısı alır.

function test()
{
  return { /* <---- curly brace on same line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}


sonraki yarı ekleme semantikleri returndiğer yerlerden biraz farklıdır ve bir satır sonu "bu noktada" akış ortasından "daha fazla" anlamına gelir.
dandavis

Yanıtlar:


165

Bu, JavaScript'in tuzaklarından biridir: otomatik noktalı virgül ekleme. Noktalı virgülle bitmeyen ancak bir ifadenin sonu olabilecek satırlar otomatik olarak sonlandırılır, böylece ilk örneğiniz şu şekilde etkili bir şekilde görünür:

function test()
{
  return; // <- notice the inserted semicolon
  { 
    javascript: "fantastic"
  };
}

Noktalı virgül eklemeden bahseden Douglas Crockford'un JS stil kılavuzuna da bakın .

İkinci örneğinizde, özelliği javascriptve değeri ile "fantastic"etkin bir şekilde şununla aynı olan bir nesneyi (küme parantezleriyle oluşturulmuş) döndürürsünüz :

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

5
Eğlenceli Bilgi: Bazı motorlarda otomatik olarak eklenen noktalı virgülleri yorumlayabilirsiniz
Christopher Tarquini

1
@ChrisT: Ne? Hangileri? Bu herhangi bir yerde araştırıldı mı?
Sean McMillan

1
@SeanMcMillan Bu konuda kesinlikle makaleler okudum, ancak hızlı bir aramadan hiçbirini bulamıyorum. Chrome'un eski sürümlerinde gizli noktalı virgülü koymanın return /*ve sonra */{ etkili bir şekilde yorumlayacağını hatırlıyorum . Bunun hala geçerli olup olmadığından emin değilim
Christopher Tarquini

2
Bu tuhaflıklar yüzünden 10 yıl önce kendime bir söz verdim: Web'den uzak durun! İnterweb'lerin kaybolması için dua ettim ... Ne yazık ki planlandığı gibi gitmedi ve şimdi bu sorunlarla da mücadele etmem gerekiyor. Karma ab * tch :)
Jowen

1
JavaScript'te dini olarak noktalı virgüllere karşı olan insanlar gördüm, her zaman noktalı virgül koymayarak kazandıkları fazladan zamanla ne yaptıklarını merak etmişimdir.
Iman Mohamadi

9

Javascript ifadelerin sonunda noktalı virgül gerektirmez, ancak dezavantajı noktalı virgüllerin nerede olduğunu tahmin etmesi gerektiğidir. Çoğu zaman bu bir sorun değildir, ancak bazen istemediğiniz noktalı virgül icat eder.

Bununla ilgili blog yazımdan bir örnek ( Javascript - neredeyse satır temelli değil ):

Kodu şu şekilde biçimlendirirseniz:

function getAnswer() {
   var answer = 42;
   return
      answer;
}

Sonra şu şekilde yorumlanır:

function getAnswer() {
  var answer = 42;
  return;
  answer;
}

Return ifadesi parametresiz biçimini alır ve argüman kendi başına bir ifade haline gelir.

Aynı şey kodunuz için de geçerlidir. İşlev şu şekilde yorumlanır:

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

3

Okunabilirlik için kişisel olarak Allman Stilini tercih ediyorum (K&R stiline karşı).

Onun yerine…

function test() {
  return {
    javascript : "fantastic"
  };
}

Severim…

function test() 
{
  var obj =
  {
    javascript : "fantastic"
  };

  return obj;
}

Ancak bu bir çözümdür. Bununla yaşayabilirim.


3
Bence ana akımdan sapan kişisel tercihlerden kaçınmalıyız. Biz okunabilirliği artacak tutarlılık teşvik çoğunluğu, tercihlerini takip etmeli
Jowen

1
Onun kodunu K & R'den daha okunaklı buluyorum. "Okunabilir" demek istediğinizde oldukça öznel
Bran

Ben de Allman'ı tercih ederim ... ama ASI nedeniyle, bir nesneyi iade etmem gerektiğinde, yarıyı dönüşle aynı satırda bırakıyorum. Bir "var x =" satırı eklemektense bunu tercih ederim ...
Mik

1

Bunun nedeni, javascript'in genellikle ";" her satırın sonunda, o kadar basit ki, {aynı satırda döndüğünüzde, javascript motoru daha fazla bir şey olacağını görür ve yeni satıra geldiğinde ";" koymayı unuttuğunuzu düşünür ve sizin için koyar.


1
Neden Cichy'nin, Darin'in ve Ivo'nun cevaplarının reddedildiğini anlamıyorum?
BoltClock

1

Buradaki küme parantezleri yeni bir nesnenin yapısını gösterir. Dolayısıyla kodunuz şuna eşdeğerdir:

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

hangisi işe yarıyor oysa yazarsanız:

function test() {
  var a = { javascript : "fantastic" };
  return; // ; is automatically inserted 
      a;
}

artık çalışmıyor.


0

Sorun aslında yukarıda açıklandığı gibi noktalı virgül enjeksiyonudur. Bu konuyla ilgili güzel bir blog yazısı okudum. Bu sorunu ve javascript hakkında çok daha fazlasını açıklıyor. Aynı zamanda bazı iyi referanslar içerir. Buradan okuyabilirsiniz


Evet, bir de okudum, okuduktan sonra burada js'nin beyni tarafından daha iyi açıklamamı istiyorum.
JustLearn
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.