Since: PMD 5.0.1
Priority: High (1)
Avoid using with - it’s bad news
This rule is defined by the following XPath expression:
//WithStatementExample(s):
with(object){property=3;// Might be on object, might be on window: who knows.}Use this rule by referencing it:
<ruleref="category/ecmascript/bestpractices.xml/AvoidWithStatement"/>Since: PMD 5.0
Priority: Medium High (2)
ECMAScript does provide for return types on functions, and therefore there is no solid rule as to their usage.However, when a function does use returns they should all have a value, or all with no value. Mixed returnusage is likely a bug, or at best poor style.
This rule is defined by the following Java class:net.sourceforge.pmd.lang.ecmascript.rule.bestpractices.ConsistentReturnRule
Example(s):
// Okfunctionfoo(){if(condition1){returntrue;}returnfalse;}// Badfunctionbar(){if(condition1){return;}returnfalse;}Use this rule by referencing it:
<ruleref="category/ecmascript/bestpractices.xml/ConsistentReturn"/>Since: PMD 5.0
Priority: High (1)
This rule helps to avoid using accidently global variables by simply missing the "var" declaration.Global variables can lead to side-effects that are hard to debug.
This rule is defined by the following XPath expression:
//Assignment[Name/@GlobalName=true()]Example(s):
function(arg){notDeclaredVariable=1;// this will create a global variable and trigger the rulevarsomeVar=1;// this is a local variable, that's okwindow.otherGlobal=2;// this will not trigger the rule, although it is a global variable.}Use this rule by referencing it:
<ruleref="category/ecmascript/bestpractices.xml/GlobalVariable"/>Since: PMD 5.0
Priority: High (1)
A for-in loop in which the variable name is not explicitly scoped to the enclosing scope with the ‘var’ keyword canrefer to a variable in an enclosing scope outside the nearest enclosing scope. This will overwrite theexisting value of the variable in the outer scope when the body of the for-in is evaluated. When the for-in loophas finished, the variable will contain the last value used in the for-in, and the original value from beforethe for-in loop will be gone. Since the for-in variable name is most likely intended to be a temporary name, itis better to explicitly scope the variable name to the nearest enclosing scope with ‘var’.
This rule is defined by the following XPath expression:
//ForInLoop[not(child::VariableDeclaration)]/Name[1]Example(s):
// Okfunctionfoo(){varp='clean';function(){varobj={dirty:'dirty'};for(varpinobj){// Use 'var' here.obj[p]=obj[p];}returnx;}();// 'p' still has value of 'clean'.}// Badfunctionbar(){varp='clean';function(){varobj={dirty:'dirty'};for(pinobj){// Oh no, missing 'var' here!obj[p]=obj[p];}returnx;}();// 'p' is trashed and has value of 'dirty'!}Use this rule by referencing it:
<ruleref="category/ecmascript/bestpractices.xml/ScopeForInVariable"/>Since: PMD 5.0.1
Priority: High (1)
This rule checks for usages of parseInt. While the second parameter is optional and usually defaultsto 10 (base/radix is 10 for a decimal number), different implementations may behave differently.It also improves readability, if the base is given.
See also:parseInt()
This rule is defined by the following XPath expression:
//FunctionCall/Name[@Identifier='parseInt'andcount(../*)<3]Example(s):
parseInt("010");// unclear, could be interpreted as 10 or 7 (with a base of 7)parseInt("10",10);// goodUse this rule by referencing it:
<ruleref="category/ecmascript/bestpractices.xml/UseBaseWithParseInt"/>