2010-10-26 38 views
72

Kod şu şekildedir:Javascript "Uncanught TypeError: nesne bir işlev değil" çağrışımsal soru

<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 "Uncaught TypeError: nesnesi bir işlev değildir" atar. Anonim işlev çağrısı/çağırma işlemini başka bir parantez kümesinde kopyalarsam, uyarıyı yürütür, ancak yine de bana bir hata verir. Eğer "var postTypes" tanımından sonra bir yarı-kolon koyarsam, o zaman tamamen iyi olacaktır.

javascript'in yarı-virgül gerektirmediğine inanıyorum, bu yüzden tamamen anlayamadığım bazı garip çağrışımsal fonksiyon kuralları olduğunu tahmin ediyorum. Umarım birisi bana bu hatayı alıyorum cevabını verebilir.

Teşekkürler.

+0

Neredeyse hem anonim bir işlev hem de statik işlev oluşturmaya çalıştığınız ve bunu tek olarak yürütmeyi beklediğiniz gibi görünüyor. Fonksiyonu kaldırırsanız ne olur() – brumScouse

cevap

73

Javascript, noktalı virgül gerektirmez, sadece kod, sözdizimi hatası olmadan kod satırında kesilip sizin için ekleyecektir *. Ne yazık ki

, kod

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

hiçbir ; eklenir, olmayan bir yazım hatasıdır.

, bu gibi sürprizler önlemek daima ; bir açıklama bitirmek için kendinizi eğitmek (çalıştırabilirsiniz Bir örnek

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

olduğunu).

(*.:... Sadece bir başparmak kuralı değil her zaman doğru yerleştirme kuralı çok daha karmaşıktır noktalı virgül ekleme ile ilgili bu blog page fazla ayrıntı vardır)

+10

Veya: Bu gibi sürprizlerden kaçınmak için, kendinizi (her zaman geçerli olmalıdır) temiz okunabilir kod yazarak eğitin ve genel ASI kurallarını bilin. Gerçekten ne kadar "bilmek" den farklı değil. JS çalışmasında. –

15

Kodunuz dava yaşar Automatic Semicolon Insertion (ASI) işlem gerçekleşmez.

ASI'ye asla güvenmemelisiniz. Düzgün ifadeleri ayırmak için noktalı virgül kullanmalısınız: Kodunuz aslında dizi nesneyi çağırmak için çalışıyordu

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

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

.

+0

Sorunu düzeltmenin bir yolu, ancak Crockford kulübünün arkasına geçemiyorum. –

+1

@pst: Tekrar söyleyeyim, Crock'ın kulübünde değilim * * – CMS

+8

@pst: Bu sınavdan keyif alacaksınız: http://asi.qfox.nl/;) – CMS

7

Benzer bir hatam var ve benim durumumda, payIndeğişkenler ve işlev de payInvoices değişkenini adlandırdığımı fark etmem biraz zaman aldı. AngularJs karıştırdı. Adını processPayments() olarak değiştirdiğimde sonunda çalıştı. Sadece bu hatayı ve çözümü paylaşmak istedim, çünkü bunu anlamak uzun zaman aldı.

+0

Aynı burada, 'alert' adlı bir değişkenim vardı ve javascript uyarı işlevini çağırmaya çalışıyordum ve 'alert bir işlev değil' diyordu. Asıl işlev yerine “alert” değişkenini çağırmaya çalışıyordu. – James111

0

İşlev dosyasını, işlev çağrısından önce JavaScript dosyanızda oluşturmaya çalışın.

İlgili konular