关于如何使用执行栈解释闭包问题

70 阅读1分钟

[如MDN中关于闭包的代码所示](闭包 - JavaScript | MDN (mozilla.org)):

function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}

function makeHelpCallback(help) {
  return function() {
    showHelp(help);
  };
}

function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Your e-mail address'},
      {'id': 'name', 'help': 'Your full name'},
      {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
  }
}

setupHelp();

这里可以用执行上下文配合执行栈解释,当.onfocus事件触发时,for循环已经结束。相应打印的结果就一直是Your age (you must be over 16)
那么如何用执行栈和执行上下文解释更换声明let、const后问题解决了呢?
已知:当进入循环后块作用域顺序运行不产生上下文,此时let、const声明的值被记录在了哪里? 闭包又是如何查找到正确的结果呢?

恳请各位大佬不吝赐教,MDN原来的解答并不能说服我自己T_T