2016-03-03 4 views
0

У меня есть класс javascript с глобальными переменными и методами, а метод specefic делает некоторые extrange.Утеряны значения глобальных переменных в классе Javascript

DOOM = (function() { 
/** Class VALIDATIONS **/ 
var validation = function (form, inputDiv, action) { 
    this.form = form; 
    this.inputDiv = inputDiv; // -- This Variable 
    this.action = action; // -- And This Variable 
}; 
validation.prototype = { 
    validate: function (rules, messages) { 
     this.rules = rules; 
     this.messages = messages; 

     console.log(inputDiv); // -- here still have value 
     console.log(inputDiv); 

     $(this.form).validate({ 
      rules: this.rules, 
      messages: this.messages, 
      submitHandler: function(form){ 

       var getDom = new DOOM.DOM(); 
       var data = getDom.buildJSONValuesByJSON(getDom.buildJSONObjByForm(inputDiv)); // -- But here, already haven't value 

       var sendData = new DOOM.callAJAX(action); 
       sendData.start(data); 

       console.log('[submitHandler] = '+ data); 
       return false; 
      }, 

В качестве обходного пути мне пришлось присвоить значение, где по-прежнему существуют глобальные переменные. Но мой вопрос: почему эти переменные потеряли свои ценности?

+0

Второе появление 'inputDiv' внутри другой функции, [который имеет другой масштаб.] (Http://stackoverflow.com/questions/500431/what-is-the-scope-of- variables-in-javascript) – Blazemonger

+2

'inputDiV' и' action' не являются глобальными переменными, они являются локальными переменными внутри функции 'validation'. – Barmar

+1

Вы должны использовать 'this.inputDiv'. – Barmar

ответ

2

Переменные, названные в списке параметров функции, всегда являются локальными переменными, а не глобальными переменными. Таким образом, в функции конструктора validation()inputDiv является локальной переменной. Если вы видите что-то, когда вы делаете console.log(inputDiv) в validation.prototype.validate(), он должен быть из другой переменной, объявленной вне отправленного вами кода.

Для доступа к inputDiv, который был предоставлен конструктору в методах, вам необходимо использовать this.inputDiv.

validation.prototype = { 
    validate: function (rules, messages) { 
     this.rules = rules; 
     this.messages = messages; 

     var inputDiv = this.inputDiv; 

     console.log(inputDiv); 

     $(this.form).validate({ 
      rules: this.rules, 
      messages: this.messages, 
      submitHandler: function(form){ 

       var getDom = new DOOM.DOM(); 
       var data = getDom.buildJSONValuesByJSON(getDom.buildJSONObjByForm(inputDiv)); 

       var sendData = new DOOM.callAJAX(action); 
       sendData.start(data); 

       console.log('[submitHandler] = '+ data); 
       return false; 
      }, 
+0

На самом деле, мне понравилось. Большое вам спасибо за ваше объяснение. Теперь я понимаю, как лучше работать с этими переменными на javascript – CR7

Смежные вопросы