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 hata verecektir:
"Uncaught TypeError: object is not a function"
Anonim işlev çağrısını/uyarısını başka bir parantez kümesi içine alırsam uyarıyı çalıştırır, ancak yine de hata verir. Eğer "var postTypes" tanımından sonra bir noktalı virgül koyarsam, o zaman tamamen iyi olacaktır.
Javascript'in noktalı virgül gerektirmediğine inandırıldım, bu yüzden tam olarak anlamadığım bazı garip fonksiyon uygulama kuralları olduğunu tahmin ediyorum. Neden bu hatayı alıyorum?
Javascript noktalı virgül gerektirir, sadece yorumlayıcı, kod onsuz sözdizimi hatasına dönüştüğünde satır sonlarında bunu sizin için ekleyecektir*.
Ne yazık ki, kod
var a = new B(args)(stuff)()
bir sözdizimi hatası değildir, bu nedenle ;
eklenmeyecektir. (Çalışabilen bir örnek
var answer = new Function("x", "return x")(function(){return 42;})();
Bu gibi sürprizlerden kaçınmak için, kendinizi bir ifadeyi her zaman ;
ile bitirmek üzere eğitin.
(*: Sadece bir başparmak kuralı. 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).
Kodunuzda Otomatik Noktalı Virgül Ekleme (ASI) işleminin gerçekleşmediği bir durumla karşılaşılıyor.
ASI'ye asla güvenmemelisiniz. İfadeleri düzgün bir ş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.
Benzer bir hata aldım ve benim durumumda dizi değişkenine payInvoices ve fonksiyona da payInvoices adını verdiğimi fark etmem biraz zaman aldı. AngularJs'in kafasını karıştırdı. İsmi processPayments() olarak değiştirdiğimde sonunda çalıştı. Bunu çözmek uzun zamanımı aldığı için bu hatayı ve çözümü paylaşmak istedim.