Javascript 函数范围外的访问变量

Javascript 函数范围外的访问变量,javascript,function,d3.js,scope,var,Javascript,Function,D3.js,Scope,Var,我有以下代码,我正在尝试访问外部的selectedBrandvar,以便在5月代码中的其他地方使用它 var selectedBrand; var brand_sel = d3.select('select') .on("change",function(b) { selectedBrand = d3.select("#brand").node().value; }); console.log(selectedBrand) 当我尝试控制台记录selecte

我有以下代码,我正在尝试访问外部的
selectedBrand
var,以便在5月代码中的其他地方使用它

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

  console.log(selectedBrand)
当我尝试控制台记录
selectedBrand
时,我会得到
undefined
结果

我几乎尝试了我所了解的一切,但没有成功


非常感谢您的帮助

您正在尝试立即记录它的值,但在执行更改处理程序之前,它将保持未定义状态:

下面有助于说明吗

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
var选择品牌;
var brand_sel=d3.选择(“选择”)
.关于(“变更”,功能(b){
selectedBrand=d3.选择(“#brand”).node().值;
run();
})

var run=function(){console.log(selectedBranch)}/只需调用您的函数
brand\u sel()

因为现在您只定义了它,但从未实际调用过它,因此它从未启动,
selectedBrand
仍然未定义

还有一些我不想在代码中处理的肮脏的范围界定。一般来说,你所做的是一个糟糕的模式,这将导致错误的道路。开始使用
const/let
来避免作用域的问题,通常尝试保持作用域干净-这很容易成为
函数返回
,而不是通过函数调用直接改变变量

至少,
“严格使用”放在代码顶部可能是个好主意


总的来说,听起来没有居高临下的意思,看起来你正在发展一些“不太好”的做法。网络上有很多很好的教程,甚至有书教JS“正确的方法”。我知道这听起来像是在抨击你,但相信我,从长远来看,这是值得的,如果你不想花3个小时调试,为什么你的值不能在循环中正确更新等等。

首先感谢你的重播。 我对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();
});

这是因为您的函数尚未运行。在触发
change
事件并执行处理程序之前,不会更改变量的值。之后,您将在
selectedBrand
中有一个新值。