Пользовательский класс javascript и проблема с областью закрытых переменных - PullRequest
0 голосов
/ 07 августа 2009

У меня возникли проблемы с классической областью видимости локальной переменной javascript, но я имею дело с переменной JSON. Я посмотрел здесь другие вопросы, касающиеся того же самого, но ничто не соответствовало моему случаю точно, так что здесь. У меня есть класс, который я сделал из JavaScript, который имеет 3 метода: func1, func2 и func3. У меня также есть локальная переменная JSON, которая устанавливается в одном из методов из вызова ajax, который я делаю с помощью jquery, но не устанавливается, когда я вызываю метод, который возвращает значение этой локальной переменной. Я знаю, что ajax работает нормально, потому что я могу без проблем отображать данные, которые возвращаются и устанавливаются в переменную json отлично. Это происходит только тогда, когда я вызываю другой метод, который взаимодействует с этой переменной JSON. Вот основная версия моего кода:

   function func1(){
       func2();
    }

    function func2(){
       $.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?",
         function(data){
            this.z = eval("(" + data.d + ")");
            alert(data.d); //this displays the data!
            alert(this.z.ArrayProperty[0].Property1); //this displays 
                                                      //the correct data too!
         }
       );   
    }

    function func3(){
       return this.z.ArrayProperty[0].Property1;
    }

    function myClass(var1, var2){
       this.x = var1;
       this.y = var2;

       this.z = "";

       this.func1 = func1;
       this.func2 = func2;
       this.func3 = func3;
    }

А затем на моей странице .html у меня есть следующий код:

var obj = new myClass(1,2);

obj.func1("abc");
alert(obj.func3()); //ERROR: this.z.ArrayProperty is undefined

Есть идеи?!?! Я ломаю голову!

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 августа 2009

Не думаю, что это как-то связано с областью действия.

Помните, что вызов AJAX является асинхронным, поэтому func3 вызывается до того, как JSON был возвращен, и ваша анонимная функция смогла установить this.z в любое значение.

0 голосов
/ 07 августа 2009

Я могу быть совершенно не прав, но похоже, что переменная "this" вас запутала. Эта переменная зависит от того, как вы вызываете функцию. Похоже, вы действительно не хотите этим пользоваться. Вместо этого я использую:

func2() {
  var that = this;

Тогда позже в коде используйте:

function(data){
  that.z = eval...
0 голосов
/ 07 августа 2009

Я не думаю, что "this" внутри вашего обратного вызова - это то же самое "this", которое определило func2. Используя библиотеку Prototype JavaScript, вы можете использовать bind (), чтобы обойти это.

Вы можете просто добавить новую переменную в func2 или использовать функцию связывания в любой используемой вами библиотеке.

func2() {
    var me = this;
       $.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?",
             function(data){
                me.z = eval("(" + data.d + ")");
                    success = true;
                    alert(data.d); //this displays the data!
                    alert(this.z.ArrayProperty[0].Property1);
             }
       );       
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...