Der Code lautet wie folgt:
<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>
Dies wird ein:
"Nicht gefangener TypeError: Objekt ist keine Funktion"
Wenn ich den anonymen Funktionsaufruf / Aufruf in einen anderen Satz von Klammern einbinde, wird die Warnung ausgeführt, es wird jedoch weiterhin ein Fehler ausgegeben. Wenn ich nach der Definition "var postTypes" ein Semikolon einfüge, ist das völlig in Ordnung.
Ich wurde zu der Überzeugung gebracht, dass für Javascript keine Semikolons erforderlich sind, daher vermute ich, dass es einige seltsame Assoziativitätsregeln für die Funktionsanwendung gibt, die ich nicht vollständig verstehe. Warum erhalte ich diesen Fehler?
javascript
PolandSpring
quelle
quelle
Antworten:
Für JavaScript sind Semikolons erforderlich. Der Interpreter fügt sie nur dann in Zeilenumbrüche ein, wenn dies möglich ist * .
Leider ist der Code
führt nicht zu einem Syntaxfehler, daher wird no
;
eingefügt. (Ein Beispiel, das ausgeführt werden kann, istUm solche Überraschungen zu vermeiden, trainieren Sie sich, eine Aussage immer mit zu beenden
;
.* Dies ist nur eine Faustregel und nicht immer wahr. Die Einfügungsregel ist viel komplizierter. Diese Blog-Seite zum Einfügen von Semikolons enthält weitere Details.
quelle
In Ihrem Code tritt ein Fall auf, in dem der ASI-Prozess ( Automatic Semicolon Insertion ) nicht stattfindet.
Sie sollten sich niemals auf ASI verlassen. Sie sollten Semikolons verwenden, um Anweisungen richtig zu trennen:
Ihr Code hat tatsächlich versucht, das Array-Objekt aufzurufen.
quelle
Ich habe einen ähnlichen Fehler erhalten und es hat eine Weile gedauert, bis mir klar wurde, dass ich in meinem Fall die Array-Variable payInvoices und die Funktion payInvoices benannt habe. Es verwirrte AngularJs. Nachdem ich den Namen in processPayments () geändert hatte, funktionierte es endlich. Ich wollte nur diesen Fehler und diese Lösung teilen, da ich lange gebraucht habe, um das herauszufinden.
quelle
alert
und versuchte, die Javascript-Alarmfunktion aufzurufen, und es würde heißen, dass "Alarm keine Funktion ist". Es wurde versucht, diealert
Variable anstelle der eigentlichen FunktionVersuchen Sie, den Funktionskörper vor dem Funktionsaufruf in Ihrer JavaScript-Datei zu haben.
quelle
Ich bekam den gleichen Fehler und verbrachte anderthalb Tage damit, eine Lösung zu finden. Naomis Antwort führte mich zu der Lösung, die ich brauchte.
Meine Eingabe (Typ = Schaltfläche) hatte ein Attribut
name
, das mit einem Funktionsnamen identisch war, der vom Ereignis onClick aufgerufen wurde. Nachdem ich das Attribut geändert hatte,name
funktionierte alles.gewechselt zu:
quelle
Ich habe diesen Fehler beim Kompilieren und Bündeln von TS mit WebPack. Es kompiliert
export class AppRouterElement extends connect(store, LitElement){....}
inlet Sr = class extends (Object(wr.connect) (fn, vr)) {....}
denen wegen der fehlenden Komma falsch zu sein scheint. Beim Bündeln mit Rollup kein Fehler.quelle