Javascript,范围问题... javascript没有很好的经验

时间:2011-05-01 17:45:23

标签: javascript callback scope this getjson

原谅我的经验不足但是这里有问题,我有两个函数,其中一个调用.getJSON,我需要在第一个函数的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看到的),并且使用我之前创建的var'self'也不起作用,因为它不在我认为的范围内,firebug没有显示任何变量'self'时在回调函数中,当然,当我尝试它时,它只是不起作用。

有什么想法吗?还需要进一步阐述吗?

2 个答案:

答案 0 :(得分:5)

您的代码在范围方面很好。 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个参数)。
  • 发布更多代码。

答案 1 :(得分:-1)

你在哪里调用renderEntry()?这是代码的关键部分。它不知道self,因为在调用renderEntry()函数时它没有被初始化。当你调用_myFunction1时,self被初始化,当函数完成执行时它就会死掉。

您是否意识到您只是初始化 renderEntry函数而不是调用它?