Javascript, проблема с областью ... не очень опытный с Javascript - PullRequest
1 голос
/ 01 мая 2011

Простите за мою неопытность, но вот проблема, у меня есть 2 функции, одна из которых вызывает .getJSON, и мне нужно вызвать 2-ю функцию из обратного вызова getJSON первой функции ... У меня много проблем.

Вот упрощенная версия того, что происходит.

MyDialog.Widget.prototype._myFunction1 = function(data) {
var self = this;

var renderEntry = function(tr,booltf) {
    $('<a href="javascript:{}">&nbsp;</a>')
            .addClass("iconbutton")
            .appendTo(tr.insertCell(0))
            .click(function() {
                $.getJSON(
                    "/command/button",
                    null,
                    function(data) {
                                      self.myFunction2(); //self isn't in scope?
                                      //this.myFunction2(); //this is actually 'this' for XHR request
                    },
                    "json"
                );
            });
//more code here (including the invoking of renderEntry()
}

MyDialog.Widget.prototype.myFunction2 = function()
{
 //Ton of code
}

Проблема в функции обратного вызова .getJSON, я хочу вызвать myFunction2, но не могу заставить ее вызватьэто ... используя 'this.myFunction2 ()' я пытаюсь получить доступ к myFunction2 внутри XHR-запроса (это то, что я вижу через firebug), и использую созданную мной переменную "self" тоже не работаетя думаю, что из-за того, что это не входит в область видимости, firebug не показывает никакой переменной 'self' внутри функции обратного вызова, и, конечно, он просто не работает, когда я пробую это сделать.Нужна ли еще какая-то проработка?

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Ваш код в порядке с точки зрения объема.self находится в области видимости и ссылается this так, как вы этого хотите.Ваш отладчик может не показать его, потому что он не входит в область действия local , но это не значит, что он не будет решен правильно.

Более простой случай может быть легко продемонстрированследующим образом:

var foo = {
   fn: function(){ console.log('Called!'); },
   invoker: function(){
      var self = this,
          local = function(){ setTimeout(function(){
                     setTimeout(function(){ self.fn(); }, 1000);
                  }, 1000); };
      local();
   }
};

foo.invoker();
  • Убедитесь, что ваш запрос выполняется успешно.
  • Удалите аргумент "json" ($.getJSON имеет только 3 параметра).
  • Опубликовать больше кода.
0 голосов
/ 01 мая 2011

где вы вызываете renderEntry ()?Это ключевая часть кода.Он не знает себя, потому что не был инициализирован при вызове функции renderEntry ().Self инициализируется, когда вы вызываете _myFunction1, и отключается, когда функция завершает выполнение.

Вы понимаете, что вы только инициализируете функцию renderEntry, а не вызываете это?

...