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

関数を呼び出すと、テストは未定義のエラーになります。

これはクロージャが必要な場合ですか?..もしそうなら、クロージャは上記のコードでどのように最適に機能しますか?

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 に答える