JavaScript “Uncaught TypeError: object is not a function” associativiteitsvraag

De code is als volgt:

<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>

Dit werpt een:

“Uncaught TypeError: object is geen functie”

Als ik de anonieme functieaanroep/aanroep tussen een andere set haakjes stop, wordt de waarschuwing uitgevoerd, maar krijg ik nog steeds een foutmelding. Als ik een puntkomma achter de “var postTypes”-definitie zet, komt het helemaal goed.

Ik werd ertoe gebracht te geloven dat JavaScript geen puntkomma’s vereist, dus ik gok dat er een aantal rare associativiteitsregels zijn voor het toepassen van functies die ik niet volledig begrijp. Waarom krijg ik deze foutmelding?


Antwoord 1, autoriteit 100%

JavaScript vereist puntkomma’s. De tolk zal ze alleen waar mogelijk voor u invoegen bij regeleinden*.

Helaas, de code

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

leidt niettot een syntaxisfout, dus er wordt geen ;ingevoegd. (Een voorbeeld dat kan worden uitgevoerd is

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

Om dergelijke verrassingen te voorkomen, moet u uzelf trainen om een statement altijd te beëindigen met ;.


*Dit is slechts een vuistregel en niet altijd waar. De invoegregel is veel ingewikkelder. Deze blogpaginaover het invoegen van puntkomma’s bevat meer details.


Antwoord 2, autoriteit 21%

Je code ervaart een geval waarbij de automatische puntkomma-invoeging(ASI) proces vindt niet plaats.

Je moet nooit vertrouwen op ASI. U moet puntkomma’s gebruiken om uitspraken op de juiste manier te scheiden:

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

Je code probeerde eigenlijk het array-object aan te roepen.


Antwoord 3, autoriteit 10%

Ik kreeg een soortgelijke fout en het duurde even voordat ik me realiseerde dat ik in mijn geval de arrayvariabele payInvoicesen de functie ook payInvoicesnoemde. Het verwarde AngularJS.

Toen ik de naam veranderde in processPayments()werkte het eindelijk.


Antwoord 4, autoriteit 4%

Ik kwam dit probleem tegen in Reageren: ik probeerde destructurerenen gebruik een benoemde export als het een standaard export was, bijvoorbeeld:

// module.js
const myFunction = () => null
export default myFunction
// component.js
// THIS WAS WRONG:
// import { myFunction } from './module'
// SHOULD BE THIS:
import myFunction from './module'

Antwoord 5

Probeer de hoofdtekst van de functie vóór de functieaanroep in uw JavaScript-bestand te hebben.


Antwoord 6

Ik kreeg dezelfde foutmelding en ben anderhalve dag bezig geweest om een oplossing te vinden. Naomi’s antwoordleidt me naar de oplossing die ik nodig had.

Mijn invoer (type=button) had een attribuut namedat identiek was aan een functienaam die werd aangeroepen door de onClick-gebeurtenis. Nadat ik het attribuut namehad gewijzigd, werkte alles.

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

gewijzigd in:

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

Antwoord 7

Ik krijg deze fout bij het compileren en bundelen van TypeScript-code met Webpack. Het compileert export class AppRouterElement extends connect(store, LitElement){....}in let Sr = class extends (Object(wr.connect) (fn, vr)) {....}wat onjuist lijkt vanwege de ontbrekende komma. Bij bundeling met Rollup, geen fout.

Other episodes