Javascript это проблема определения объема - PullRequest
3 голосов
/ 14 января 2011

Я загружаю CSV-файл и анализирую его.и я хочу, чтобы полученный массив был членом определенного объекта, но в итоге он не определен, потому что я неправильно использую ключевое слово "this".

function SimPlayer(){

    this.dataset = new Array();
    var client = new XMLHttpRequest();
    var dset = this.dataset;

    function handler(){
        if(client.readyState == 4){
            if(client.status == 200){
                //file is done loading
                //split by lines
                dset = client.responseText.split("\n");
                for(var i=0; i<dset.length; i++){
                    //split each line by commas
                    dset[i] = dset[i].split(",");
                    //convert to ints
                    for(var j=0; j<dset[i].length; j++){
                        dset[i][j] = parseInt(dset[i][j]);
                    }
                }
                //dset is defined here, no problem. It contains the data from the csv file
                console.log(dset[0]);
            }
        }
    }
    client.onreadystatechange = handler;
    client.open("GET", "http://nathannifong.com/LayerCake/simdata/rec0_i0.csv");
    client.send();

    this.check = function(){
        //does not work because this.dataset will be empty.
        console.log(this.dataset[0])
    }
}

Предположим, я создаю экземпляр SimPlayer., а затем вызовите проверку позже (после того, как CSV-файл успел загрузить)

foo = new SimPlayer();
//....time passes....
foo.check();

foo.check () вызывает

Uncaught TypeError: Cannot read property '0' of undefined

Как исправить код, чтобыcheck (), this.dataset будет содержать данные из файла csv?

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Вам захочется сохранить ссылку на эту привязку:

var _this = this;
this.check = function(){
    //does not work because this.dataset will be empty.
    console.log(_this.dataset[0])
}
1 голос
/ 14 января 2011

В качестве альтернативы вы можете рассмотреть следующий пример:

this.check = (function(thus){
    return function() {//does not work because this.dataset will be empty.
       console.log(thus.dataset[0])
    };
})(this);

PS: я не полностью прочитал исходное сообщение, мой пример - только альтернативный способ ответа.Вы можете найти такой код во многих примерах JavaScript.Вы должны понимать, используя замыкания.

...