Can';t在尝试的验证函数中访问javascript父函数-可能需要关闭

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)

我正试图编写一个简单的函数来验证输入,但在访问父对象函数时遇到了问题

认为问题是我需要一个闭包,但由于我对js非常陌生,我很难理解闭包,我想在我的代码中看到闭包可能会有所帮助,如果这确实是个问题的话

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');