在尝试验证功能中无法访问javascript父函数 - 可能需要关闭

时间:2012-10-29 17:42:28

标签: javascript scope closures

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

认为问题是我需要一个闭包但是因为我对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 错误。

这是一个需要闭包的情况吗?..如果是这样,在上面的代码中闭包效果怎么样?

2 个答案:

答案 0 :(得分:1)

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

: - )

答案 1 :(得分: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时尚未声明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');