Javascript var inside loop is not defined



我敢打赌你们很多人都有这个问题,它可能被称为"Javascript隐式全局var"或类似的东西。基本上,我正在尝试编写一个验证工具,并且我有一个类MIMIRxErrorHandler.它有 2 种方法,validate()验证所有字段,validateSpecificField(),用于验证每个字段。奇怪的是,在方法validate()中,它总是抛出以下错误:

rule is not defined for line: "let fieldName = rule.name;"


有人可以帮助我度过难关吗?多谢。整个代码如下:

class MIMIRxErrorHandler {
constructor(props) {}
validate(rules) {
var errorMessages = {};
for (var i = 0; i < rules.length; i++) {
let rule = rules[i];
let fieldName = rule.name;
const validationResult = this.validateSpecificField(
rule.value,
rule.rules
);
if (validationResult.length > 0) {
errorMessages[fieldName] = `${fieldName} ${validationResult.join(",")}`;
}
}
return errorMessages;
}
validateSpecificField(value, rules) {
const isPresence = rules.presence;
const rangeRule = rules.range;
const regexRule = rules.regex;
const otherNotAllowedValuesRule = rule.otherNotAllowedValues;
var errorMessages = [];
//  ***  range  ***
if (isPresence) {
if (value === null || value === undefined || value === NaN) {
errorMessages.push(` cannot be blank`);
}
}
if (rangeRule !== null && rangeRule !== undefined) {
const type = rangeRule.type;
if (type == "number") {
value = parseFloat(value);
if (value > rangeRule.maxLength || value < rangeRule.minLength) {
errorMessages.push(
` between ${rangeRule.minLength} and ${rangeRule.maxLength}`
);
}
} else if (type == "string") {
value = value.toString();
if (
value.length > rangeRule.maxLength ||
value.length < rangeRule.minLength
) {
errorMessages.push(
` between ${rangeRule.minLength} and ${rangeRule.maxLength}`
);
}
}
}
if (regexRule !== null && regexRule !== undefined) {
if (!value.match(regexRule.pattern)) {
errorMessages.push(regexRule.regexErrorMessage);
}
}
if (otherNotAllowedValuesRule.includes(value)) {
errorMessages.push(" is invalid");
}
return errorMessages;
}
}
rules = () => {
return [
{
name: "first_name",
value: "John",
rules: {
presence: true,
range: {
type: "string",
minLength: 10,
maxLength: 200,
},
regex: {
pattern: /^w+$/,
regexErrorMessage: " should only be letters",
},
otherNotAllowedValues: ["0", ""],
},
},
{
name: "age",
value: "23",
rules: {
presence: true,
range: {
type: "number",
minLength: 1,
maxLength: 3,
},
regex: {
pattern: /^d+$/,
regexErrorMessage: " should be only digits",
},
otherNotAllowedValues: ["0", ""],
},
},
];
};
var a = new MIMIRxErrorHandler();
console.log(a.validate(this.rules()));

代码中有两个错误:

  1. const otherNotAllowedValuesRule = rule.otherNotAllowedValues;
    引用错误:未定义规则。
    更改
    const otherNotAllowedValuesRule = rules.otherNotAllowedValues;

  2. if (!value.match(regexRule.pattern)) {类型错误:值.匹配不是函数
    更改
    if (typeof value == 'string' && !value.match(regexRule.pattern)) { errorMessages.push(regexRule.regexErrorMessage); } if (typeof value == 'number' && !value.toString().match(regexRule.pattern)) { errorMessages.push(regexRule.regexErrorMessage); }

注意:我假设rules是一种类MIMIRxErrorHandler的方法。

var a = new  MIMIRxErrorHandler()
console.log(a.validate(a.rules()));

在使用作为列表或其他对象的项创建的值时,在操作中使用它们之前确保它们具有价值始终很重要。

通常,您使用if(rule)来测试数据,该实际上检查规则中的值。

或者,也许在您走得那么远之前,它还可以帮助您通过在尝试访问它的任何项目之前测试if(rules.length > 0来确保rules : type []具有价值。

最新更新