Can';t在尝试的验证函数中访问javascript父函数-可能需要关闭
我正试图编写一个简单的函数来验证输入,但在访问父对象函数时遇到了问题 我认为问题是我需要一个闭包,但由于我对js非常陌生,我很难理解闭包,我想在我的代码中看到闭包可能会有所帮助,如果这确实是个问题的话Can';t在尝试的验证函数中访问javascript父函数-可能需要关闭,javascript,scope,closures,Javascript,Scope,Closures,我正试图编写一个简单的函数来验证输入,但在访问父对象函数时遇到了问题 我认为问题是我需要一个闭包,但由于我对js非常陌生,我很难理解闭包,我想在我的代码中看到闭包可能会有所帮助,如果这确实是个问题的话 function validate(value, validator){ if(validator == 'login_cred'){ testName(value); } var test = { minLength: function (val, length)
function validate(value, validator){
if(validator == 'login_cred'){
testName(value);
}
var test = {
minLength: function (val, length) {
return val.length >= length;
}
}
function testName(value){
if(!test.minLength(value, 5)){
console.log('more chars please...');
}
}
}
//call
validate("str", 'login_cred');
当我调用函数时,我得到的测试是未定义的错误
这是一个需要关闭的案例吗?。。如果是这样的话,在上面的代码中,闭包如何工作得最好?否,变量在范围内,您不需要额外的闭包。只有在调用使用它的
testName
之后才将其分配给var测试。将test
对象(以及testName
声明)移动到顶部:
function validate(value, validator) {
function testName(value) {
if (!test.minLength(value, 5)) {
console.log('more chars please...');
}
}
var test = {
minLength: function (val, length) {
return val.length >= length;
}
}
if (validator == 'login_cred') {
testName(value);
}
}
//call
validate("str", 'login_cred');
当然,除非您在该函数中有更多的代码,否则您应该将其缩减为
function validate(value, validator) {
if (validator == 'login_cred' && value.length < 5)
console.log('more chars please...');
}
函数验证(值、验证程序){
如果(验证器=='login\u cred'&&value.length<5)
console.log('请输入更多字符…');
}
:-)函数testName被挂起。因此,您的代码实际上看起来是这样的
function validate(value, validator){
function testName(value){
if(!test.minLength(value, 5)){
console.log('more chars please...');
}
}
if(validator == 'login_cred'){
testName(value);
}
var test = {
minLength: function (val, length) {
return val.length >= length;
}
}
}
//call
validate("str", 'login_cred');
正如您所看到的,调用test时它还没有被声明,简单地将testName放在底部并不会改变这一点。只需将代码更改为此,它就会工作
function validate(value, validator){
var test = {
minLength: function (val, length) {
return val.length >= length;
}
}
if(validator == 'login_cred'){
testName(value);
}
function testName(value){
if(!test.minLength(value, 5)){
console.log('more chars please...');
}
}
}
//call
validate("str", 'login_cred');