JavaScript - 嵌套函数删除数组的 .length

标签 javascript scope nested-function

我正在尝试编写一个应用程序,可以记录按键并将其存储到名为“热键”的变量中。这个想法是创建一系列按键来定义同时按键输入和触发操作的热键。

问题是我一直遇到函数作用域问题。根据我对函数作用域的理解,嵌套函数(在本例中为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" />

嵌套两个函数可能不方便。另一种选择是简单地在函数外部定义热键,使其位于两者的范围内,或者重新设计逻辑,以便只有一个函数需要访问它。例如,您的事件处理程序不需要执行太多逻辑 - 它只需找出按下的键并将其传递给管理状态的对象即可。

关于JavaScript - 嵌套函数删除数组的 .length,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50081823/

相关文章:

javascript - 模态和输入组插件中的 Bootstrap 弹出窗口

javascript - HackerRank 上的配对算法

Python 基本嵌套语句和作用域概念

c - C 中的可移植嵌套函数

javascript - 获取不同地点的经纬度值到一个值

javascript - Firebase 实时数据库在实际构建中无法在 Ionic iOS 上运行,但可以在实时重新加载中运行

javascript - 将局部变量传递给回调函数

javascript - 为什么没有 'var' 关键字的变量不在 Chrome 控制台的全局范围内?

javascript - 在隔离作用域指令中,在作用域上定义变量和在 Controller 上定义变量之间有什么区别吗?

Python - 直接嵌套函数调用