javascript - JavaScript - 嵌套函数删除数组的 .length
问题描述
我正在尝试编写一个可以记录按键并将按键存储到一个名为“热键”的变量中的应用程序。这个想法是创建一个按键数组来定义一个同时按键输入和触发动作的热键。
问题是我一直遇到函数范围问题。根据我对函数范围的理解,嵌套函数(在本例中为 anyKey)应该可以访问其父范围的所有变量(在本例中为 testFunc())。
我觉得我在这里遗漏了一些重要的东西,但我不确定它是什么。我知道它与保留变量的嵌套函数有关,但它似乎应该如何工作。有任何想法吗?我需要在这里自学的任何主要概念吗?
提前致谢。
function testFunc() {
var hotkey = [];
console.log("hotkey length is:"+hotkey.length) //Yields "hotkey length is:0"
hotkey[0] = "dummy";
input.addEventListener("keydown", anyKey);
}
function anyKey(ev, txt, hotkey){ //If I don't enter hotkey as a paremeter, I'm notified "hotkey is not defined". If I _do_ enter it, I get "nested hotkey length is: undefined
console.log("nested hotkey length is:"+hotkey);
let target = ev.currentTarget;
let tag = target.tagName;
let char = ev.char || ev.charCode || ev.which;
log(char, tag);
let s = String.fromCharCode(char);
log(s);
/***
The following code, consequentially, doesn't work because hotkey.length isn't defined
***/
for(i = 0; i <= hotkey.length + 1; i++){
if (hotkey[i] === undefined || hotkey[i] === "dummy"){
hotkey[i] = char;
}
}
解决方案
正如评论指出的那样,anyKey()
它没有嵌套在testFunc()
,它只是从内部调用testFunc()
。这不足以共享相同的范围。这是一个嵌套在另一个函数中的示例,显示它们共享一个变量,该变量keyCount
跟踪按键按下的次数:
function testFunc() {
let keyCount = {}
let input = document.getElementById('myInput')
input.addEventListener("keydown", addCount);
// addCount is nested here
function addCount(ev) {
let key = ev.key
// this functin has access to keyCount because it's nested
// within testFunc
keyCount[key] = (keyCount[key] || 0) + 1
console.log("counts: ", keyCount)
}
}
testFunc()
<input id='myInput' type="text" />
嵌套两个函数可能不方便。另一种选择是hotkey
在函数之外简单地定义它将在两者的范围内,或者重新设计逻辑,以便只有一个函数需要访问它。例如,您的事件处理程序不需要做太多的逻辑——它可以找出按下的键并将其传递给管理状态的对象。
推荐阅读
- node.js - 隐藏节点js和angular8的端口号
- sql - 如何编写更好的 SQL 语句进行数据验证
- android - 如何在 Android Studio 中执行命令?
- r - 通过R执行SQL查询后清除缓存
- python - check_hostname 需要币安的 server_hostname
- java - Spring Boot Batch:获取 Reader 可连接的 ExecutionContext
- java - 如何在 JFrame 中将图像设置为背景
- mysql - 为什么我的默认值在 MySQL 中不起作用
- css - 使用旧 CSS 样式表的浏览器?
- r - dplyr 根据某些条件创建新列