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
中有一个新值。