2016-07-30 106 views
0

我有以下代码。JS返回函数不存在

var handleJson = function(){ 
     var jsonData ='xx'; 
     var eventObject,eventObjectx=[]; 
     that = this; 
     var convertJsonToObject = function(datax){ 
       //debugger; 
       try { 
         that.printList(datax.data); 
        } catch(e) { 
         console.log(e); 
        } 

       //debugger; 
      } 

     return{ 

      getDatafromserver: function(url){ 

        $.ajax({ 
         crossOrigin: true, 
         url: url, 
         success:convertJsonToObject 
          //console.log(jsonData); 
        }); 

      }, 

      printList:function(eventObject){ 

       $.each(eventObject,function(index,val){ 

        $('#eventlist').append('<li>'+val.event+'</li>'); 
       }) 
      } 

     } 
    } 


    var jsonHandler = new handleJson(); 

     jsonHandler.getDatafromserver(url); 

     //jsonHandler.printList('eventlist'); 


}); 

虽然功能printList存在其返回错误

TypeError: that.printList is not a function {stack: (...), message: "that.printList is not a function"}

任何一个能帮助我吗?

+0

它存在,但它没有分配给'this'(或'that')。 – JJJ

+0

@Juhana所以应该采取什么正确的方法来做到这一点,我知道如果我只是得到JsonObject的return和pass参数外的List函数,我可以做到这一点,但在这种情况下,我该如何解决它? – Vikram

回答

1

this从您的that = this行开始的值与您在handleJson函数结束时返回的对象没有任何关系。

由于您使用newhandleJson,您要添加的对象this指,而不是返回一个新的,不相关的对象:

var handleJson = function() { 
    var jsonData = 'xx'; 
    var eventObject, eventObjectx = []; 
    var that = this; 
    var convertJsonToObject = function(datax) { 
     //debugger; 
     try { 
      that.printList(datax.data); 
     } catch (e) { 
      console.log(e); 
     } 

     //debugger; 
    } 

    this.getDatafromserver = function(url) { 

     $.ajax({ 
      crossOrigin: true, 
      url: url, 
      success: convertJsonToObject 
       //console.log(jsonData); 
     }); 

    }; 

    this.printList = function(eventObject) { 

     $.each(eventObject, function(index, val) { 

      $('#eventlist').append('<li>' + val.event + '</li>'); 
     }) 
    }; 

}; 

var jsonHandler = new handleJson(); 

jsonHandler.getDatafromserver(url); 

//jsonHandler.printList('eventlist'); 

下面是new作品:

  • 它创建一个由目标函数的prototype属性引用的对象支持的新对象;所以在你的情况下,一个由handleJson.prototype支持的新对象。
  • 它调用目标函数(handleJson)与this引用该新对象。
  • 当目标函数返回时,如果它没有返回任何东西,或者它返回一个原始值,或者返回null,则new将它创建的对象作为其结果;但是如果目标函数返回非对象引用,那么将覆盖默认值,并且new将该对象引用作为其结果。

在你原来的代码中,最后一点就是进入游戏。


边注:您的代码是堕入The Horror of Implicit Globals becuse你没有宣布that。我在上面添加了var


边注:JavaScript中的压倒性的惯例是,构造函数(您是通过new调用一个函数)以大写字母开头。它们通常也是名词而不是动词(其他类型的函数通常是动词,但不是构造函数,它们以它们构造的东西命名)。所以JsonHandler而不是handleJson

+0

@ T.JCrowder好的,所以在一个像我这样定义的闭包中,函数如何访问其他函数? , 那可能吗? ,或者我应该创建一个类并添加这些函数作为它们的原型? – Vikram

+0

我只是想学习正确的方法在js中使用OOPS – Vikram

+0

@Vikram:答案中的更新代码就是这样做的。你可以把'printList'放在原型上;你不能把'getDataFromserver'放在原型上,因为在这个代码中它想要使用'handleJson'中定义的'convertJsonToObject'函数。你有变量,而你没有在这个函数中使用,所以很难提出如何重新配置​​它。 –