JSLint和JSHint在遇到一条将变量赋值为undefined的赋值语句时,会抛出"It is not necessary to initialize '{a}' to 'undefined'"的错误。以下是我们尝试着声明x并将undefined赋值给它的例子:
这个错误是为了强调一些令人感到疑惑的代码。如果不修改,这些代码会正常运行且没有错误,但是你会不必要的增加了脚本的大小。
由于变量声明在其出现的作用域内置于最顶部,且赋值操作在正常的位置尽心,变量总是会被隐式地初始化为undefined。以下是当你进入一个作用域时发生的一切:(ES5 §10.5):
8. For each VariableDeclaration... d in source text order do
a. Let dn be the Identifier in d.
b. Let varAlreadyDeclared be the result of calling env's HasBinding concrete method passing dn as the argument.
c. If varAlreadyDeclared is false, then
i. Call env's CreateMutableBinding concrete method passing dn and configurableBindings as the arguments.
ii. Call env's SetMutableBinding concrete method passing dn, undefined, and strict as the arguments.
最后一行非常有趣。它有效的将当前作用域内给定的标示符和undefined值绑定在了一起。这表明所有变量在创建的时候的值都是undefined。如果赋值表达式被作为语句的一部分,那么变量就会被赋予一个值(如同我们上方的例子一样)。这在下面这段话中被解释的更为清楚:(ES5 §12.2):
Variables are initialised to undefined when created. A variable with an Initialiser is assigned the value of its AssignmentExpression when the VariableStatement is executed, not when the variable is created.
你可以将赋值表达式删除来解决这个错误。变量仍将有一样的值:
如果由于某些原因,你必须将某些值赋给变量,可以将undefined换成一些可以返回undefined的值。最简单的例子就是使用void操作符:
如果你将undefined覆盖了,那么你实际上将不同的值赋给了你的变量,使用了更明确的标示符。JSLint和JSHint都没有选项会强调这个错误。
在JSHint1.0.0及以上你可以通过可选的特殊语法来忽略这些警告。这个警告的标示符是W080。这就意味着你可以通过 /*jshint -W080 */
告诉JSHint不去报告这个错误。