2013-01-20 3 views
0

재귀 함수를 호출 중이며 재귀 호출에서받은 오류를 호출자에게 연결하고 싶습니다. 다음은 코드입니다. 그러나 _errors 변수가 내 인스턴스간에 공유되는 것처럼 보입니다. 어떻게이 _errors 변수를 인스턴스에 고유하게 만들 수 있습니까?자바 스크립트 변수가 인스턴스간에 공유 됨

var check = require('./validator.js').check; 

var QV = function() { 
    this._errors = {}; 
} 

QV.prototype.a = function (str) { check(str).len(1,4).notNull().isInt() }; 
QV.prototype.b = function (str) { check(str).len(1,4).notNull().isInt() }; 
QV.prototype.c = function (str) { check(str).len(1,4).notNull().isInt() }; 
QV.prototype.validator = function (opt) { 
    qv = new QV(); 
    for(var i in opt) { 
     try { 
      if (opt[i].toString() === '[object Object]') 
      { 
      var errors = qv.validator(opt[i]); 
      console.log(qv._errors); //Here the qv._errors is overwritten with the 'sub' errors. I lose the error 'a' here. 
      qv._errors[i] = errors; 
      } 
      else 
      { 
      qv[i](opt[i]); 
      } 
     } catch (e) { 
      qv._errors[i] = e; 
     } 
    } 
    return qv._errors; 
} 

module.exports = QV; 

는 그리고 검증

var test = require('./test_validator.js'); 
var q = new test(); 

msg = q.validator({ 
    'a' : "asdf", 
    'sub' : { 
     'b' : "asdf", 
     'c' : "bsdf" 
    } 
}); 
console.log(msg); 
+1

"var"로 "qv"를 선언하십시오! 현재 글로벌 변수입니다. 다른 말로하면 단 하나의 "qv"가 있습니다. – Pointy

+0

좋습니다. 그것은 작동합니다. 심지어 var없이 선언 할 때조차도 qvx로 이름을 변경하더라도 오류가 발생하지 않습니다. Howver, 일단 var로 선언하면 작동합니다. 감사! – John

답변

3

대답은 코멘트에 이미를 수행하는이 코드를 사용합니다. 나는 당신을 제안 다음

1)를 사용하여 자바 스크립트 "엄격한"모드 -이 오류 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode

2) 스크립트에 대해 jshint을 사용하려면이 같은 실수를 변환하는 최신 브라우저를 만들 것입니다 - 그것은이 같은 오류를 방지 할 수 있습니다 http://jshint.com/