JavaScript - вложенная функция сбрасывает .length массива - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь написать приложение, которое может записывать и сохранять нажатия клавиш в переменную под названием «горячая клавиша». Идея состоит в том, чтобы создать массив нажатий клавиш, чтобы определить горячую клавишу одновременных нажатий клавиш и действий с ними.

Проблема в том, что я продолжаю сталкиваться с проблемой области действия функции. Из того, что я понял о области действия функции, вложенные функции (в данном случае 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;
        }
    } 

1 Ответ

0 голосов
/ 29 апреля 2018

Как отмечается в комментариях 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 вне функций, где оно будет находиться в пределах их обоих, или переработать логику, так что только одна функция нуждается в ней. Например, ваш обработчик событий не должен выполнять большую логику - он может просто выяснить, какая клавиша нажата, и передать ее объекту, который управляет состоянием.

...