Код выглядит следующим образом:
<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>
В результате будет выброшена ошибка:
"Uncaught TypeError: object is not a function"
Если я оберну анонимный вызов/призыв функции в другой набор круглых скобок, то он выполнит предупреждение, но все равно выдаст ошибку. Если же поставить точку с запятой после определения "var postTypes", то все будет в порядке.
Меня убедили в том, что javascript не требует точки с запятой, поэтому я делаю предположение, что существуют какие-то странные правила ассоциативности при применении функций, которые я не до конца понимаю. Почему я получаю эту ошибку?
Javascript действительно требует полутонов, просто интерпретатор будет вставлять их за вас на разрывах строк, когда без них код станет синтаксически ошибочным*.
К сожалению, код
var a = new B(args)(stuff)()
не является синтаксической ошибкой, поэтому ;
не будет вставлен. (В качестве примера, который может быть запущен, можно привести
var answer = new Function("x", "return x")(function(){return 42;})();
Чтобы избежать подобных сюрпризов, приучите себя всегда завершать утверждение символом ;
.
(*: Просто правило большого пальца. Не всегда верно. Правило вставки гораздо сложнее. На этой странице блога о вставке точки с запятой рассказано более подробно).
В вашем коде встречается случай, когда процесс Automatic Semicolon Insertion (ASI) не происходит.
Никогда не следует полагаться на ASI. Для правильного разделения высказываний следует использовать точку с запятой:
var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!
(function() { alert('hello there') })();
На самом деле ваш код пытался вызвать объект массива.
У меня возникла похожая ошибка, и я не сразу понял, что в моем случае я назвал переменную массива payInvoices и функцию тоже payInvoices. Это сбило AngularJs с толку. Как только я изменил название на processPayments(), все заработало. Просто хотел поделиться этой ошибкой и ее решением, так как мне потребовалось много времени, чтобы разобраться в этом.
Я получаю эту же ошибку и потратили полтора дня пытаюсь найти решение. Наоми'ы ответ приведет меня к решению мне нужно.
Мое мнение (кнопка типа=) имел атрибут "имя", которое тождественно имя функции, которое вызывается событие onclick. После того как я изменил атрибут " имя " все работало.
<input type="button" name="clearEmployer" onClick="clearEmployer();">
изменен на:
<input type="button" name="clearEmployerBtn" onClick="clearEmployer();">