доступ к var вне области действия функции - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть следующий код, и я пытаюсь получить доступ к selectedBrand var извне, чтобы использовать его в другом месте в коде мая

var selectedBrand;
var brand_sel = d3.select('select')
    .on("change",function(b) {
        selectedBrand = d3.select("#brand").node().value;
    });

  console.log(selectedBrand)

, когда я пытаюсь объединить selectedBrand, я получаю undefined результаты .

Я стараюсь почти все, что понимаю, безуспешно

большое спасибо за любую помощь

Ответы [ 3 ]

0 голосов
/ 15 февраля 2020

просто вызовите вашу функцию brand_sel().
Потому что сейчас вы только определили ее, но фактически никогда не вызывали, поэтому она никогда не запускалась и selectedBrand остается неопределенной.

Также это грязная грязная область видимости, с которой я бы не хотел иметь дело в своем коде. В общем, то, что вы делаете, это плохая модель, которая приведет к ошибкам в будущем. Вместо этого начните использовать const / let, чтобы избежать проблем с областью видимости, и в целом старайтесь поддерживать чистоту области видимости - это может быть просто function return, а не прямое изменение переменной через вызов функции.

На самом по крайней мере, "use strict"; в верхней части вашего кода может быть хорошей идеей.

В целом, не имея смысла звучать снисходительно, похоже, что вы разрабатываете "не очень хорошие" практики. В Интернете есть много хороших учебных пособий или даже книг, которые учат JS «правильному пути». Я знаю, что это может звучать так, будто я вас ругаю, но, поверьте мне, в долгосрочной перспективе это будет стоить того, если вы не хотите тратить 3 часа на отладку, почему ваши значения не обновляются должным образом в циклах и тому подобное.

0 голосов
/ 15 февраля 2020

в первую очередь спасибо за повтор. Я совершенно новичок в javascript и учусь на практике. Возможно, я совершенно не понимаю js logi c где-то.

В любом случае, возможно, я поделюсь неправильным запросом, надеясь, что он решит мою проблему. Возвращаясь к проблеме, как это было в начале.

Допустим, у меня есть переменная, подобная этой

    var filteredMedia =nest1.filter(function(d) {
  return d.key == brand_sel})[0]

, где brand_sel необходимо обновить как при загрузке страницы, так и при изменении ,

brand_sel - значение выбранного параметра раскрывающегося списка.

с использованием этого кода

    function update() {
   var brand_sel = d3.select("#brand").node().value
  return brand_sel;
}
var brand_sel = update();

console.log(update())

все работает при загрузке страницы.

Теперь я пытаюсь запустить функцию update также при изменении следующим образом, но, конечно, мне все еще не хватает понимания чего-то

d3.select('select').on("change", function(){
  update();
});
0 голосов
/ 15 февраля 2020

Вы пытаетесь зарегистрировать его значение немедленно , но оно останется неопределенным до тех пор, пока не будет выполнен ваш обработчик изменений:

Помогает ли ниже иллюстрация?

var selectedBrand;
var brand_sel = d3.select('select')
   .on("change",function(b){
      selectedBrand = d3.select("#brand").node().value;
      run();
   })

var run = function() { console.log(selectedBranch); } // <- this runs after you've defined the value because you've called `run()` in your change handler
console.log(selectedBrand); // <- this runs first, while the value is undefined

Это похоже на возраст Как мне вернуть ответ от асинхронного вызова?

...