Как я могу получить доступ к переменным вне текущей области видимости в JavaScript? - PullRequest
6 голосов
/ 03 мая 2010

Я пишу приложение в javascript и не могу понять, как получить доступ к переменным, объявленным в моей функции, внутри этого анализа jquery. Внутри я могу получить доступ к глобальным переменным, но на самом деле я не хочу создавать глобальные переменные для этих значений.

В основном я хочу извлечь имена файлов из XML-документа в переменной simulationFiles. Я проверяю, равен ли атрибут узла значению simName, и извлекаю две строки внутри элементов xml, эта часть, на мой взгляд, работает.

Как мне извлечь эти элементы xml и добавить их в локальные переменные? * +1007 *

function CsvReader(simName) {
    this.initFileName = "somepath";
    this.eventsFileName = "somepath";
    $(simulationFiles).find('simulation').each(function() {
       if ($(this).attr("name") == simName) {
           initFileName += $(this).find("init").text();
           eventsFileName += $(this).find("events").text();
       }
    });
}   

Ответы [ 3 ]

14 голосов
/ 03 мая 2010

this в функции CsvReader - это не то же самое, что this в обратном вызове each() (где вместо этого это текущий элемент в итерации). Чтобы получить доступ к области действия внешней функции в обратном вызове, мы должны иметь возможность ссылаться на нее под другим именем, которое вы можете определить во внешней области:

function CsvReader(simName) {
    this.initFileName = "somepath";
    this.eventsFileName = "somepath";
    var self = this; // reference to this in current scope
    $(simulationFiles).find('simulation').each(function() {
       if ($(this).attr("name") == simName) {
           // access the variables using self instead of this
           self.initFileName += $(this).find("init").text();
           self.eventsFileName += $(this).find("events").text();
       }
    });
}
4 голосов
/ 03 мая 2010

Я сделал рабочую демонстрацию (я изменил ее, чтобы использовать классы, чтобы она работала с HTML).

function CsvReader(simName) {
    this.initFileName = "somepath";
    this.eventsFileName = "somepath";
    var context = this;
    $(simulationFiles).find('simulation').each(function() {
       if ($(this).attr("name") == simName) {
           context.initFileName += $(this).find("init").text();
           context.eventsFileName += $(this).find("events").text();
       }
    });
}   
1 голос
/ 10 июля 2018

Самое простое изменение, которое вы можете сделать, чтобы заставить его работать, это ... Измените вашу функцию в каждой из нормальных (function () {}) на стрелочную функцию (() => {}), которая автоматически примет контекст функция, в которой он определен.

...