在我的代码中,我选择了一些HTML输入并添加了footComparer
函数作为回调。
我试图通过添加一个helpers对象来简化我的代码,该对象将包含一些helper函数。
问题是当它碰到这一行时:
selectedSearchDropdown.style.display = '';
它抛出参考错误:
selectedSearchDropdown is not defined.
我很难理解为什么此处的闭包不起作用。因为footComparer
函数作为闭包保留在内存中,所以不应该访问selectedSearchDropdown
函数吗?
const searchInputs = document.querySelectorAll('.searchBox__input');
searchInputs.forEach(input => input.addEventListener('input', footComparer));
function footComparer(e) {
helpers.elementSelector(e);
selectedSearchDropdown.style.display = '';
}
let helpers = {
elementSelector: function (e) {
let selectedSearchDropdown = e.target.parentNode.childNodes[3];
}
答案 0 :(得分:1)
检查let
到底是什么:doc。
我建议您阅读该书(在github上免费):You don't know JS。它应该可以帮助您了解范围,闭包等。
基本上,let
关键字在特定的{}
内创建变量。 let
赋予您特权,以声明范围受限制的变量,而不是var
来声明表达式,因此let
仅在该特定块内可用。
var
是一个关键字,它在全局范围内定义变量,而与块范围无关。
答案 1 :(得分:1)
我认为您在这里混淆了一些概念。
footComparer
函数无法访问selectedSearchDropdown
变量,因为它是在不同的 Scope 中定义的。有关javascript范围的更多信息,请参见:Scope
在您的特定示例中,有效的代码是:
let helpers = {
elementSelector: function (e) {
return e.target.parentNode.childNodes[3];
}
const searchInputs = document.querySelectorAll('.searchBox__input');
searchInputs.forEach(input => input.addEventListener('input', footComparer));
function footComparer(e) {
selectedSearchDropdown = helpers.elementSelector(e);
selectedSearchDropdown.style.display = '';
}
答案 2 :(得分:0)
否,用let
声明的变量仅在定义了花括号的范围内可用。
但是,您可以return
选定的SearchDropdown。