Tackling JavaScript strict warnings
Credits: This tutorial is written and contributed by Alex Vincent with contributions by Robert Ginda. Alex is a long time visitor of JavaScript Kit, and participant of CodingForums.
Netscape 6 and the Mozilla browser introduce a new feature for debugging efforts: strict warnings. These are messages from the JavaScript engine inside the browser about some very common minor mistakes in JavaScript. These mistakes, unlike errors, do not stop execution of the webpage. But they do slow it down a bit, and they're very easily fixed.
Before we get into the types of strict warnings, let me show you how to find them first. In Mozilla, go to Edit, Preferences, Debug, and check the box for "Show strict JavaScript warnings". Then, in the JavaScript Console (Tasks->Tools, JavaScript Console in Netscape 6 and older Mozilla builds; Tools->Web Development->JavaScript Console in newer Mozilla builds), select the Warnings panel. (The All panel will do as well; it shows errors and strict warnings, in the order of when they happened.)
So let's take a moment now to review the types of warnings you would see in a browser.
Variable Declaration Warnings
Error #1:
- JSMSG_UNDECLARED_VAR
"assignment to undeclared variable varName"
This happens when we fail to declare the existence of the variable
using var
or const
. We've often tended to do
this deliberately, to set a global variable from within a function:
function go() { blue = "#00007f" // throws warning return true } x = go() alert(blue) // returns "#00007f"
Solution: There's really no reason not to declare the existence
of blue
outside the function (even after the function definition, since functions
don't execute until we call them).
function go() { blue = "#00007f" return true } var blue; x = go() alert(blue) // returns "#00007f"Error #2:
- JSMSG_UNDEFINED_PROP
"reference to undefined property propertyName"
We see this one fairly often too. Especially when we say if
(document.layers)
or if (document.all)
, with which we
simply assume the parent object exists:
foo = new Object(); var k = foo.bar; // warning alert(k);
Solution: It's easy to fail-safely detect a property:
var foo = new Object(), k; if (typeof foo.bar != "undefined") { k = foo.bar } else { k = undefined } alert(k);Error #3:
- JSMSG_REDECLARED_VAR
"redeclaration of var varName"
"redeclaration of const constName"
This happens when you use a var
or const
statement on a variable name you defined earlier in the function or at a
higher scope (say, in the global scope outside all functions). One typical
cause of this warning is the following:
if (this > 0) { var response = true } else { var response = false }
Solution: JavaScript doesn't need the second var
keyword here. Simply use:
var response; if (this > 0) { response = true } else { response = false }
- Tutorial introduction (variable declaration warnings)
- Function related strict warnings
- Miscellaneous strict warnings