Everything works fine when I wrote the js logic in a closure as a single js file, as:
(function(win){ //main logic here win.expose1 = .... win.expose2 = .... })(window)
but when I try to insert a logging alternative function before that closure in the same js file,
window.Glog = function(msg){ console.log(msg) } // this was added before the main closure. (function(win){ //the former closure that contains the main javascript logic; })(window)
it complains that there is a TypeError:
Uncaught TypeError: (intermediate value)(...) is not a function
What did I do wrong?
Answer
The error is a result of the missing semicolon on the third line:
window.Glog = function(msg) { console.log(msg); }; // <--- Add this semicolon (function(win) { // ... })(window);
The ECMAScript specification has specific rules for automatic semicolon insertion, however in this case a semicolon isn’t automatically inserted because the parenthesised expression that begins on the next line can be interpreted as an argument list for a function call.
This means that without that semicolon, the anonymous window.Glog
function was being invoked with a function as the msg
parameter, followed by (window)
which was subsequently attempting to invoke whatever was returned.
This is how the code was being interpreted:
window.Glog = function(msg) { console.log(msg); }(function(win) { // ... })(window);