2016-07-30 102 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'函數。你有變量,而你沒有在這個函數中使用,所以很難提出如何重新配置​​它。 –