JS返回函数不存在

时间:2016-07-30 07:11:42

标签: javascript

我有以下代码。

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不是函数{stack:(...),message:   &#34; that.printList不是函数&#34;}

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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将其创建的对象作为其结果;但是如果目标函数返回非null对象引用,则覆盖该默认值,new将该对象引用作为结果。

在原始代码中,最后一点正在发挥作用。

旁注:您的代码正在成为The Horror of Implicit Globals的牺牲品,因为您没有声明that。我已经在上面添加了var

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