SORU
1 EYLÜL 2013, Pazar


Sayı değişmez çağıran üye işlev

Edebi işlevleri çağırmak için çalışıyorum, ama garip davranış alıyorum.

true döndüren bu kodu göz önünde bulundurun.

   23 === (23)

Ben yazarken şunları deneyin.

(23).toFixed(2)

Çalıştığımda _23.00_ 23.toFixed(2) Bu hata alıyorum beklenen sonuç alıyorum.

SyntaxError: Unexpected token YASADIŞI

Nasıl JavaScript bu anlayamıyorum ifadeleri değerlendiriyor ve neden bu hatayı alıyorum?

CEVAP
1 EYLÜL 2013, Pazar


Cevapları Greg Hewgill icktoofay doğru tüm yollar, ancak, istiyorum eğil biraz, soyutlama-bilge: Bakalım neler oluyor göre javascript şartname.

Spec Section 7.8.3 sayısal sabitler tanımlar. Aşağıdaki görebiliriz

DecimalLiteral ::
    DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
    . DecimalDigits ExponentPart(opt)
    DecimalIntegerLiteral ExponentPart(opt)

DecimalIntegerLiteral ::
    0 
    NonZeroDigit DecimalDigits(opt)

DecimalLiteral, bir numara, bir demet ondalık basamak, muhtemelen ardından bir nokta, muhtemelen ardından diğer basamak (tüm ihraç edilebilir ve ardından bir üs, e12 örneğin). Diğer bir deyişle, 42. yasal 42 eşit 3e2 300 eşittir.

Not nasıl eğer bir nokta var, biz de bunu daha fazla rakam/üs izledi olmasını bekliyoruz, ya da hiçbir şey tarafından izlenmesi. Ancak, bu önemli bir parçasıdırnokta sayısının parçasıdır. Nokta operatörü, obj.prop, ele nasıl bakmak için ilerlerken, bu hatırlıyorum.

Section 11.2.1, Property Accessors üye erişim için nokta ve ayraç açıklar:

MemberExpression . IdentifierName

CallExpression umurumuzda değil hangi işlevini çağırır. MemberExpression bir daha bekliyoruz nasıl 27 ** - ama bunun için benim sözüme etmeyin, bak ve doğru olup olmadığımı bir olabilir) dikkat edin.

Küçük noktayı görüyor musunuz? Mantıksal öne atlayıp "Evet, düzeni bir nokta var...4.foo...neden bir hata var?" bir nokta var demek Kullandığım kimin bu cümleler, unuttun varsayımsal arkadaşım ne yazık ki benim DecimalLiteral ne kadar benziyor! Hadi iki örnek üzerinden gitmek ve ne olduğunu görün.

42.foo
^

Şapka yapıyoruz karakteri temsil eder. Şimdiye kadar, DecimalLiteral / DecimalIntegerLiteral / NonZeroDigit (bunu söylemesi zor) içindeyiz. Sonraki karaktere geçelim:

42.foo
 ^

Hala numarasını parçası, mükemmel geçerli bir DecimalDigit.

42.foo
  ^

Tamam, bu yüzden DecimalIntegerLiteral kısmı bitti. İşte düzeni aynı diyagram:

DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
                      ^

Bir sayının son derece geçerli bir parçası olan bir nokta, yani yapıyoruz. Şimdi biz tüketmeknumarasının bir parçası olarakve devam:

42.foo
   ^

f sayı azalıyor ExponentPart DecimalDigits ne de bölümü şimdi de. Eee, ne olacak şimdi? f bu ne? Hiçbir şeyin parçası değil. Belki bir erişimci özelliği var mı? Hadi düzeni bir göz atın:

MemberExpression . IdentifierName
      ^

MemberExpression, kesinlikle değiliz ama nokta zaten numarasının bir parçası olduğunu takip eden bir nokta yok. Sözdizimsel bir hata ulaştık: biz yürütme kes ve at. Umarım camdan bir evde yaşamıyorsun.

Umarım şimdi 42..foo neden çalıştığını anlamak. MemberExpression dışarı çıktığımızda başka bir nokta karşı karşıyayız:

              42..foo
                 ^
MemberExpression . IdentifierName
                 ^

IdentifierName tamamen yasal izledi.

Elbette numarasından nokta ayırmak için birkaç başka yolları da var. Sen gelene kadar bir şekilde, gerçek surround parantez: (42).foo. Parantez sonuna vardığımızda, nokta MemberExpression ve geldik. Başka bir yol eklemek için bir alan: 42 .foo beri bir uzay parçası olamaz ve çözümleyici için nötr bir renk, bir hata yükseltmek istemiyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008
  • talkandroid

    talkandroid

    27 Mayıs 2010