在功能范围之外访问var

时间:2020-02-15 14:10:22

标签: javascript function d3.js scope var

我有以下代码,并且我试图在外部访问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 :(得分:0)

您正尝试立即记录它的值,但是直到执行更改处理程序之后,它才会保持未定义状态:

下面的帮助说明吗?

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

这感觉就像是How do I return the response from an asynchronous call?岁的人

答案 1 :(得分:0)

只需调用您的函数brand_sel()
因为现在您只定义了它,但从未真正调用过它,因此它从未触发过,selectedBrand仍未定义。

这也是我不想在代码中处理的一些肮脏的范围。通常,您正在执行的是错误的模式,这会导致错误。开始使用const / let来避免范围问题,并且通常尝试使作用域保持整洁-这很容易成为function return,而不是通过函数调用直接更改变量。

至少,在代码顶部的"use strict";可能是个好主意。

总的来说,听起来并不逊色,您似乎正在开发一些“不太好”的做法。网络上甚至书籍都有很多好的教程,它们确实教会了JS“正确的方法”。我知道这听起来可能像是在抨击您,但请相信我,从长远来看,如果您不想花3个小时进行调试,为什么您的值不能在循环中正确地更新以及什么都没更新,这是值得的。 / em>

答案 2 :(得分:0)

首先感谢您的重播。 我对javascript很陌生,正在边做边学。可能我完全误解了js逻辑。

无论如何,可能我会分享错误的请求,希望它可以解决我的问题。 回到开始时的问题。

假设我有一个这样的变量

    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();
});