JavaScript Reference Error – Undefined top-level function.

I have recently done some JavaScript coding, not because I’d do it often, but just because the occasion arose. And, while doing so, I frequently obtained the error message, from my in-browser debugger, that a top-level function, which I had defined in my JavaScript, and which was to be called from within HTML elements, was simply not defined. To illustrate exactly what I mean, I’ll give my most-recent example:

 


<script type="text/javascript" src="http://dirkmittler.homeip.net/zip.js/dist/zip-full.min.js"></script>
<script type="text/javascript" src="http://dirkmittler.homeip.net/text/Brotherhood_Wolf-asciiart/viewer_z.js"></script>
</head>

<body onload="loadZip()">

 

In this case, when the body was loaded, at some point in the exercise, ‘loadZip’ did not seem to be defined.

This is a type of error which could happen to anybody – newbies and professionals alike – but, which a newbie might not understand the origin of. And, for the sake of argument, I’ll just assume for the moment, that the reader is not so much a newbie, that he or she failed to supply the file ‘viewer_z.js’, or, that within this file, he or she failed to try to define the function ‘loadZip’ (both of these being my own examples).

To understand why this error takes place, the reader should understand, that in modern browsers, JavaScript is compiled, and no longer, just interpreted. Most often this will happen, because the browser’s built-in JavaScript compiler failed to compile either an entire ‘.js’ File, or, an entire in-line script. The browser acts, as if that script had never been supplied.

Most often, this happened to me, just because I was missing a closing parenthesis somewhere. What was happening was, that the JavaScript compiler that runs in the browser was waiting for that closing parenthesis, all the way to the end of the script, and encountered the end of the script, which, in the case of in-line scripts is denoted by a closing ‘</script>’ tag, before ever finding that missing, closing parenthesis.

Next, the compiler treats the entire script, as if it had never been supplied.

On one rare occasion, the same thing happened to me, because I had put ‘await’ keywords, into a function the definition of which was not preceded by the ‘async’ keyword.

Either way, this was due to JavaScript which could not be compiled, and which was therefore ‘never defined’, as far as modern browsers are concerned.

If this is happening to my reader, then chances are, they are looking for a simple error like that, and not for anything more complex.

 

Hypothetically, the same thing would happen in the case of an in-line script, if the Web-author simply failed to provide an explicit ‘</script>’ tag. In this case, the compiler will scan a presumed script to the end of the file, where most of the file isn’t JavaScript, and do so despite another browser-component displaying the ‘<body>…</body>’.

Either way, somebody failed to provide a closing delimiter of some kind, that would have corresponded to a provided opening delimiter…


 

BTW, The reader may rest assured, that when JavaScript is being provided externally – i.e., via a ‘.js’ File – one must not put any tags into it (except, perhaps, in string literals), because the compiler doesn’t know how to parse HTML tags.

 

 

Dirk

 

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>