2011-05-01 2 views
1

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

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

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()» Я пытаюсь получить доступ a 'myFunction2' внутри запроса XHR (это то, что я вижу через firebug), и использование var 'self', которое я создаю раньше, не работает либо потому, что это не в области, я думаю, firebug не показывает никакой переменной «self», когда внутри функции обратного вызова, и, конечно, это просто не работает, когда я пытаюсь это сделать.

Любые идеи? нужна ли дальнейшая разработка?

+0

Если 'self' не были в области, вы получили бы ошибку при попытке выполнить' self.something'. Может быть, ваша проблема - это что-то еще? – hugomg

ответ

-1

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

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

+0

Это в // больше кода здесь –

+0

Не знаю, что вы подразумеваете под «идет мертвым», и у меня есть сильное подозрение, что это не что-то, что относится к JS. – julkiewicz

5

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

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

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 параметра).
  • Опубликовать больше кода.
Смежные вопросы