Javascript "Yakalanmamış TypeError: nesne bir işlev değil" ilişkilendirilebilirlik sorusu


95

Kod aşağıdaki gibidir:

<body>
    <a href="javascript:;" id="test">hello</a>
</body>

<script type="text/javascript">
    document.getElementById("test").addEventListener("click", function () {
      test()
    }, false)
    function test() {
      var postTypes = new Array('hello', 'there')   
      (function() { alert('hello there') })()
    }
</script>

Bu bir:

"Yakalanmamış TypeError: nesne bir işlev değil"

Anonim işlev çağrısını / çağrıyı başka bir parantez kümesine sararsam, uyarıyı çalıştıracak, ancak yine de bana bir hata verecektir. "Var postTypes" tanımından sonra noktalı virgül koyarsam, o zaman tamamen düzelir.

Javascript'in noktalı virgül gerektirmediğine inanmaya yönlendirildim, bu yüzden tam olarak anlamadığım fonksiyon uygulamasının bazı tuhaf ilişkisellik kuralları olduğunu tahmin ediyorum. Neden bu hatayı alıyorum?


Görünüşe göre hem anonim bir işlev hem de statik bir işlev oluşturmaya çalışıyor ve tek olarak çalışmasını bekliyorsunuz. ()
İşlevini

Yanıtlar:


88

JavaScript noktalı virgül gerektirir, sadece yorumlayıcı bunları sizin için mümkün olduğunda satır sonlarına ekler * .

Maalesef kod

var a = new B(args)(stuff)()

yok değil bir sözdizimi hatasına neden, bu nedenle ;eklenecektir. (Çalıştırılabilecek bir örnek

var answer = new Function("x", "return x")(function(){return 42;})();

Böyle sürprizlerden kaçınmak için kendinizi her zaman bir ifadeyi bitirecek şekilde eğitin ;.


* Bu sadece pratik bir kuraldır ve her zaman doğru değildir. Ekleme kuralı çok daha karmaşıktır. Noktalı virgül ekleme ile ilgili bu blog sayfası daha fazla ayrıntıya sahiptir.


13
Veya: Bunun gibi sürprizlerden kaçınmak için, kendinizi temiz okunabilir kod yazma konusunda eğitin (ki bu her zaman geçerli olmalıdır) ve genel ASI kurallarını bilin ... Bu gerçekten JS'deki kapanışların nasıl çalıştığını "bilmekten" farklı değildir.

18

Kodunuz, Otomatik Noktalı Virgül Ekleme (ASI) işleminin gerçekleşmediği bir durumla karşılaşır .

YSZ'ye asla güvenmemelisiniz. İfadeleri doğru şekilde ayırmak için noktalı virgül kullanmalısınız:

var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!

(function() { alert('hello there') })();

Kodunuz aslında dizi nesnesini çağırmaya çalışıyordu.


Sorunu çözmenin bir yolu ama Crockford kulübünün arkasına geçemiyorum.

1
@pst: Ben Crock's-kulüp değilim, bir daha soruyorum Let hiç :)
Christian C. Salvado

Bu durumda sert sözler için özür dilerim :(

Sınavdan zevk aldım. YSZ, gerçekten de icky koduyla korkunç derecede kafa karıştırıcıdır!

8

Benzer bir hata aldım ve benim durumumda dizi değişkenini payInvoices olarak adlandırdığımı ve işlevin de payInvoices olduğunu fark etmem biraz zaman aldı. AngularJ'lerin kafasını karıştırdı. Adımı processPayments () olarak değiştirdikten sonra sonunda işe yaradı. Bunu anlamam uzun zaman aldığı için sadece bu hatayı ve çözümü paylaşmak istedim.


Aynı burada, adında bir değişken vardı alertve javascript uyarı işlevini çağırmaya çalışıyordum ve 'uyarı bir işlev değil' diyordu. alertGerçek işlev yerine değişkeni çağırmaya çalışıyordu
James111

0

JavaScript dosyanızdaki işlev çağrısından önce işlev gövdesine sahip olmaya çalışın.


0

Aynı hatayı alıyordum ve bir buçuk gününü bir çözüm bulmaya çalışarak geçirdim. Naomi'nin cevabı beni ihtiyacım olan çözüme götürdü.

Girdiğim (type = button) name, onClick olayı tarafından çağrılan işlev adıyla aynı olan bir özniteliğe sahipti . Özniteliği değiştirdikten sonra nameher şey çalıştı.

<input type="button" name="clearEmployer" onClick="clearEmployer();">

şu şekilde değiştirildi:

<input type="button" name="clearEmployerBtn" onClick="clearEmployer();">

0

TS'yi WebPack ile derlerken ve paketlerken bu hatayı alıyorum. Bu derler export class AppRouterElement extends connect(store, LitElement){....}içine let Sr = class extends (Object(wr.connect) (fn, vr)) {....}nedeniyle virgül eksik yanlış görünüyor. Toplama ile gruplanırken hata yok.

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.