0

我正在尝试编写一个简单的函数来验证输入,但我无法访问父对象函数。

认为问题在于我需要一个闭包,但由于我对 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');

当我调用该函数时,我得到test is undefined错误。

这是需要闭包的情况吗?..如果是这样,闭包在上面的代码中如何工作得最好?

4

2 回答 2

1

不,变量在范围内,您不需要额外的闭包。只有您分配给使用它的调用var test 后。testNametest对象(和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...');
}

:-)

于 2012-10-29T17:46:34.603 回答
1

函数 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');
于 2012-10-29T17:46:47.347 回答